Flow Reference コンポーネント

Flow Reference は、Mule イベントを同じ Mule アプリケーション内で別のフローやサブフローにルーティングし、参照先のフローですべてのプロセッサーを実行してから、イベントを元のフローにルーティングします。次の図は、1 つのフローが別のフローを参照したときの処理の順序を示しています。

flowref about 8b5d1

メインのフローがトリガーされると、Mule イベントは Flow Reference に到達するまでそのフローを実行します。次に、イベントは参照先のフローを最初から最後まで実行し、メインフローに戻ります。

このプロセスにより、参照先のフロー全体を現在のフロー内の 1 つのコンポーネントのように扱うことができます。

このプロセスにより、参照先のフロー全体を現在のフロー内の 1 つのコンポーネントのように扱うことができます。たとえば、ファイルをリストすることが多いフローは、List 操作の出力を処理する別のフローを参照できます。ファイルをリストするフローにすべての処理ステップを追加する代わりに、処理フローを参照する Flow Reference を追加できます。

Flow Reference の設定

Flow Reference コンポーネントを設定するには、Anypoint Studio で以下の手順を実行します。

  1. [Mule Palette (Mule パレット)]​ から、参照先フローへのコールを作成するフロー内のポイントまで Flow Reference コンポーネントをドラッグします。

    flow-ref-create

  2. Flow Reference のプロパティを開いて、参照するフローの名前を ​[Flow name (フロー名)]​ に指定します。

    flow-ref-config

実際のフロー名を使用して ​[Flow name (フロー名)]​ (​name​) 属性を定義してください。動的値 (DataWeave 式、変数) を使用して参照先フローを指定すると、パフォーマンスが低下します。また、MUnit テストおよびアプリケーション分析ツールは動的参照では正常に機能しない可能性があります。

Flow Reference 対象変数を使用したコンテンツの強化

現在のペイロードと変数を使用したフローを実行しつつ、プロセスの完了後も Mule メッセージが変更されないようにしたい場合があります。この場合は、対象変数を使用することで、元のメッセージを変更せずに、参照先フローの処理結果を格納できます。

Flow Reference のプロパティで以下の項目を設定することで、Flow Reference コールの結果を対象変数に格納できます。

  • Target (対象)​: Flow Reference がメッセージの処理結果を格納するために作成する変数の名前。

  • Target Value (対象値)​: 操作の出力に対して評価される式。この評価の結果は、定義された対象変数に保存されます。

対象変数を使用する場合の考慮事項

Flow Reference コンポーネントで ​target​ 変数を設定すると、元のメッセージは変更されません。つまり、参照先のフローでペイロードや変数が変更されても、参照先のフローでプロセッサーの実行が完了した後は、ペイロードや変数は元の値に戻ります。

一方、​target​ 変数を設定しないと、参照先のフローでペイロードや変数に対して行われた変更は、参照先のフローの実行が完了した後も保持され、ペイロードや変数の元の値が変更されます。

参照先フローでのエラー処理動作

Flow Reference コンポーネントによって参照されているフロー内でエラーが発生すると、参照先フローの実行が停止し、参照先フローのエラーハンドラーに処理が渡されます。参照先フローでエラーハンドラーが設定されていない場合は、Flow Reference コールを含むフローまでエラーが伝播され、このフローで設定されている Error Handler コンポーネントでエラーが処理されます。

エラーが発生した場合は、フローの実行が停止して正常に終了しないため、対象変数は設定されません。

Flow Reference の XML 例

次の XML コードは、​Flow Reference の設定​で作成したプロジェクトを表しており、Flow Reference コンポーネントがコールした 2 つ目のフローの結果を格納するための対象変数 ​flowReferenceVar,​ が追加されています。この変数は、​vars.flowReferenceVar​ のログを記録することで、メインフローでも使用されます。

<!-- Main flow -->
<flow name="mainFlow" >
  <http:listener doc:name="Listener" config-ref="HTTP_Listener_config" path="test"/>
  <set-payload value="Original payload" doc:name="Set Payload"  />
  <set-variable value="1" doc:name="Set myVar=1" variableName="myVar"/>
  <!-- Flow Reference component with target variable flowReferenceVar -->
  <flow-ref doc:name="secondaryFlow" name="secondaryFlow" target="flowReferenceVar"/>
  <logger level="INFO" doc:name="Log payload" message='#["Payload = " ++ payload]'/>
  <logger level="INFO" doc:name="Log myVar" message='#["myVar = " ++ vars.myVar]'/>
  <logger level="INFO" doc:name="Log flowReferenceVar" message='#["flowReferenceVar = " ++ vars.flowReferenceVar]'/>
</flow>
<!-- Secondary flow that is referenced from Main flow-->
<flow name="secondaryFlow" doc:id="044ece19-aa71-4fc9-ad34-8df655dd59a8" >
  <set-payload value="Modified payload" doc:name="Update Payload" />
  <set-variable value="2" doc:name="Update myVar=2" variableName="myVar"/>
</flow>

次のログは、アプリケーション例の実行後の出力を表しています。

INFO  LoggerMessageProcessor: Payload = Original payload
INFO  LoggerMessageProcessor: myVar =  1
INFO  LoggerMessageProcessor: flowReferenceVar =  Modified payload

Flow Reference コンポーネントから ​target="flowReferenceVar"​ を削除すると、アプリケーションは次の出力を返します。

INFO  LoggerMessageProcessor: Payload = Modified payload
INFO  LoggerMessageProcessor: myVar = 2
INFO  LoggerMessageProcessor: flowReferenceVar = null

ログは、読みやすいように省略されています。