ArcESBでは複数のフローを連動させて実行させたい時があります。 たとえばあるフローの終了後に別のフローを開始するケースです。 このとき、前のフローの終端コネクタと次のフローの先頭コネクタを矢印で結ぶことで連動させることは可能ですが、 コネクタ同士を矢印で繋いだ場合、コネクタ間のトランザクションデータのやりとりが前提となります。
しかし、データの連携を行わずにシンプルにフロー間の動作のみを連動させたい場合があります。 この課題に対し、ArcESBのイベント機能とスクリプトでコネクタの開始を制御しフローを連動させることができます。 本記事では、イベント機能を利用し、あるフローの開始と同時にまたは完了した後に他のフローを実行する方法を紹介します。
- 1. サンプルフロー
- 2. バッチ処理の設定
- 3. フローを開始するスクリプト
- 4. フロー1の開始と同時に他のフロー2を開始する
- 5. フロー1完了後にフロー2を実行する
- 6. 応用編:フロー1の開始時にエラーが発生したらフロー2を実行する
1. サンプルフロー
今回は以下のフローを例として説明します。 データベースからデータを受信し、マッピング後に別のデータベースにデータを送信するフローが二つあります。 説明の便宜上、左のフローから「フロー1」、「フロー2」とします。 それぞれのフローの先頭にあるデータベースコネクタではデータの受信、つまりデータの取得(SELECTクエリ)を実行します。 フローの最後にあるデータベースコネクタではデータの送信、つまりデータの追加(INSERTクエリ)を実行します。
このサンプルフローをもとに、以下二つのシナリオを実現する方法を説明します。
以下シナリオで、「フローの完了」とは終端コネクタでのデータの送信、「フローの開始」とは先頭コネクタでのデータの受信を示しています。 今回、フローの先頭でデータを送信、またはフローの最後でデータを受信するケースは対象としません。
シナリオ1. フロー1の開始と同時に他のフロー2を開始する
フロー1の先頭コネクタの受信直後にフロー2の先頭コネクタで受信を実行します。 フロー1とフロー2が同時に実行されます。
シナリオ2. フロー1完了後にフロー2を開始する
フロー1の終端コネクタの送信直後にフロー2の先頭コネクタで受信を実行します。 フロー1の終了後にフロー2が実行されます。
2. バッチ処理の設定
フローの連動は各フローのバッチ処理が前提となります。 複数のトランザクションファイルが処理されると、処理された数だけ「次フローの開始処理」が実行されてしまいます。 そのため複数のトランザクションファイルを一つのファイルにまとめるバッチ処理の設定を行ってください。
受信コネクタでバッチ処理(受信データを一つのトランザクションファイルにまとめる)を行う場合、以下のように[Advanced]タブの[Max Records]を「-1」に設定してください。
フロー先頭の受信コネクタでバッチ処理が設定されていれば、フローを流れるトランザクションデータは1つのファイルにまとめられて処理されます。 他のコネクタでのバッチ設定は必要ありません。
3. フローを開始するスクリプト
フローを連動させるときには、コネクタのイベントに他のコネクタで受信を実行する以下のスクリプトを記述します。 スクリプトのvalueには受信するコネクタのIDを指定します。 これに別のフローの先頭コネクタのIDを指定することで、コネクタの処理と連動して別のフローを開始させることができます。
<arc:set attr="input.portid" value="<受信するコネクタID>" /> <arc:call op="portReceiveFile" in="input" />
4. フロー1の開始と同時に他のフロー2を開始する
フロー1の先頭コネクタの「受信後」イベントにフロー開始のスクリプトを設定します。
先頭コネクタを選択して[イベント]タブを開いてください。 上にあるイベント選択欄で[受信後]を選択し、前述のスクリプトを入力してください。 スクリプトのvalue属性にはフロー2の先頭コネクタのIDを指定してください。
5. フロー1完了後にフロー2を実行する
フロー1の終端コネクタの「送信後」イベントにフロー開始のスクリプトを設定します。
フロー1の終端コネクタを選択して[イベント]タブを開いてください。 上にあるイベント選択欄で[送信後]を選択し、前述のスクリプトを入力してください。 スクリプトのvalue属性にはフロー2の先頭コネクタのIDを指定してください。
6. 応用編:フロー1の開始時にエラーが発生したらフロー2を実行する
これまで説明した内容を応用して、フロー1のエラーの発生時にフロー2を実行する方法を説明します。 以下のスクリプトは、フロー実行スクリプトにエラー発生時に実行という条件をつけています。
<arc:check attr="ErrorMessage"> <arc:set attr="input.portid" value="<受信するコネクタID>" /> <arc:call op="portReceiveFile" in="input" /> </arc:check>
これをイベントに設定することで、当該コネクタでエラーが発生した際に別のフローを実行するエラー分岐処理が可能です。