Talend (Open Studio利用) for ESB で REST や SOAP のサービスを構築した際に、色々と慣れるまでに苦労した点を、つらつらと記録します。
1. REST
1-1. tRESTRequest のエンドポイントには相対パス
Getting Started Guide でも Components Reference Guide でも、tRESTRequest を使ったサンプルではエンドポイントを http://[IP/Domain]:[Port]/[ServiceName]
のような形で指定している。
だがそうすると、Studio での実行時は問題ないが、Talend Runtime 環境に持ってゆくとデプロイに失敗する。
(trun -> list すると Failure
と表示される。refresh してもダメ。)
ではどうするか。
エンドポイントには /[ServiceName]
とだけ指定すればよい。
環境に応じて次のようにデプロイされる。
(ポート番号は標準設定の場合のもの。)
実行環境 | URL |
---|---|
Studio | http://localhost:8090/[ServiceName] |
Talend Runtime | http://[IP/Domain]:8040/services/[ServiceName] |
1-2. OSGIビルド時のコンテキスト切替
ビルド時に "自律実行ジョブ" が選択されていると、コンテキストスクリプトの切り替えオプションが画面に表示されるので問題ないが、"OSGIバンドル (ESB)" を選択するとこのオプションが消える。
ではどうするか。
例えばジョブ名が MyRESTService で、コンテキストに Default と Prod の2つが用意され、本番は Prod で運用したい場合には、デプロイ先サーバの "[TalendRuntimePath]/container/etc/" ディレクトリに、"MyRESTService.cfg" というテキストファイルを作成し、中に次の1行を記載すればよい。
context = Prod
2. SOAP
2-1. tESBConsumer で SOAP ログを確認
tESBConsumer の "Log messages(ログメッセージ)" オプションをオンにすると、実際にやりとりした Outbound と Inboud のメッセージがログに出力される。
だがいつの頃から、このオプションが効かなくなった。(TOS_ESB v6.3.0 で確認。)
ではどうするか。
"File(ファイル)" -> "Edit Project Properties(プロジェクトプロパティの編集)" -> "Log4j" の順に開いて、次の設定をテンプレートに加えてやればよい。
<logger name="org.apache.cxf.services">
<level value="INFO" />
<appender-ref ref="CONSOLE" />
</logger>
参考: source4code.info: JAX-WS - CXF logging request and response SOAP messages using Log4j
2-2. REST/SOAP 同居
REST と SOAP の2つの入り口を設け、内部処理は同じもの、返す値も同じものとしたい場合。
REST は普通にジョブ作成から始まり .jar ファイルが生成される。
SOAP はサービス作成から始まり .kar ファイルが生成される。
つまり一つのジョブに2つの入り口は設けられそうにない。
ではどうするか。
実際の処理は別ジョブで作成し、tRunJob で連携させればよい。
メンテナンス性も向上するし、いいことづくめ。
1. REST入口ジョブ: tRESTRequest -> tFlowToIterate -> tRunJob(3.へ) -> tRESTResponse
2. SOAP入口ジョブ: tESBProviderRequest -> tXMLMap -> tRunJob(3.へ) -> tXMLMap(WSDLに合わせる) -> tESBProviderResponse
3. 実際の処理ジョブ: (contextで引数受け取り) -> (実際の処理やエラー処理) -> tXMLMap -> tBufferOutput
(以上)