Choice ルータ

Choice ルータは、メッセージコンテンツを評価する一連の DataWeave 式に従ってフローで動的にメッセージをルーティングします。各式は、異なるルーティングオプションに関連付けられます。これにより、大部分のプログラミング言語の ​if​/​then​/​else​ コードブロックのような条件付き処理がフローに追加されます。

Choice ルータが実行するルートは 1 つのみです。つまり、最初に ​true​ と評価された式がルートの実行をトリガし、他のルートはチェックされません。どの式も ​true​ でない場合は、デフォルトルートが実行されます。

Choice ルータの系統図
Figure 1. 3 つのオプション (1 つはデフォルトオプション) がある Choice ルータの系統図

設定

Choice ルータを設定するには、1 つ以上の評価する条件と、いずれかの条件が ​true​ と評価された場合に実行されるメッセージプロセッサを指定します。さらに、定義された条件がいずれも ​true​ でない場合に実行されるデフォルトルートを設定します。

Anypoint Studio 設定

Studio で Choice ルートを設定するには、次の手順に従います。

Studio の Choice 設定

  1. Choice​ コンポーネントをフローの任意の位置にドラッグします。

  2. Choice ルータ内の ​[When (条件)]​ をクリックし、プロパティウィンドウで ​[Expression (式)]​ の値を設定して、評価する条件を指定します。

  3. [When (条件)]​ 内にメッセージプロセッサをドラッグして、条件を満たした場合に実行されるプロセッサを指定します。

  4. [Default (デフォルト)]​ 内にメッセージプロセッサをドラッグして、定義された条件をいずれも満たさなかった場合に実行されるプロセッサを指定します。

XML 設定

Choice ルータの基本的な XML 構造を次に示します。

<choice doc:name="Choice">
  <when expression=${expressionToEvaluate}> (1)
  	<!-- Message processors --> (2)
  </when>
  <otherwise>
    <!-- Message processors--> (3)
  </otherwise>
</choice>
1 expression​ 属性には、評価する条件が含まれています。
2 expression​ が ​true​ と評価された場合に実行される任意の数のメッセージプロセッサを追加します。
3 条件がいずれも ​true​ と評価されなかった場合に実行される任意の数のメッセージプロセッサを追加します。

Choice ルータへのルートの追加

デフォルトでは、Choice ルータは設定された DataWeave 式が ​true​ に評価されると実行される 1 つのルートオプションと、既存ルートのどの式も ​true​ に評価されなかったときに実行されるデフォルトルートを持ちます。複数の条件を評価して、成立した条件に応じて異なる操作を実行する必要がある場合は、ルートを追加してください。

Studio でコンポーネントをドラッグしてルートを追加する

Anypoint Studio の ​[Mule Palette (Mule パレット)]​ で任意のコンポーネントをクリックして、Choice ルータまでドラッグします (黒い垂直線が表示されます)。

add+route+option

XML を編集してルートを追加する

XML 設定ファイルを編集して Choice ルータにルートオプションを追加することもできます。

  1. Studio で Choice ルータを右クリックして ​[Go to XML…​ (XML へ移動…​)]​ を選択します。

  2. <choice>​ 要素内に ​<when>​ 要素を追加します。

    <!--Content based routing example flow -->
    <flow name="content-based-routingFlow">
      <http:listener config-ref="HTTP_Listener_config" path="/" doc:name="Listener"/>
      <set-variable variableName="language" value="#[attributes.queryParams.language]" doc:name="Set Variable" />
      <!-- Choice router block-->
      <choice doc:name="Choice" >
        <when expression="#[vars.language == 'Spanish']" >
          <set-payload value="Hola!" doc:name="Reply in Spanish" />
        </when>
        <when expression="#[vars.language == 'French']" >
          <set-payload value="Bonjour!" doc:name="Reply in French" />
        </when>
        <!-- This is the new route option added in this step -->
        <when>
        </when>
        <otherwise>
          <flow-ref name="reply-in-default-languageSub_Flow" doc:name="reply-in-default-languageSub_Flow" />
        </otherwise>
      </choice>
      <logger level="INFO" doc:name="Log the reply" message='#["The reply $(payload) means hello in $(vars.language)" ]'/>
    </flow>

新しい ​<when>​ 要素を追加すると、新しいルートオプションが [Message Flow (メッセージフロー)] ビューに表示されます。 new-route-option

サンプルプロジェクト

Anypoint Studio を使用して、Anypoint Exchange からサンプルプロジェクト ​Content-Based Routing​ (コンテンツベースのルーティング) をダウンロードできます。このプロジェクトでは、Choice ルータを使用するフローの稼働サンプルが提供されます。

choice-router-example
Figure 2. 3 つのオプション (1 つはデフォルトオプション) がある Choice ルータを含むフロー

このサンプルプロジェクトをダウンロードして開く手順は、次のとおりです。

  1. Anypoint Studio で [Exchange] アイコン (​3%​) をクリックします。

  2. 左側のパネルで ​[All assets (すべてのアセット)]​ をクリックします。

  3. 開いたウィンドウで、Anypoint Exchange にログインし、サンプルプロジェクトの Content-Based Routing (コンテンツベースのルーティング) を検索します。

  4. [Open (開く)] アイコン (​6%​) をクリックします。

サンプルプロジェクトの動作

プロジェクトを Mule アプリケーションとして実行すると、アプリケーションは次のアクションを実行します。

  1. メッセージをリスンします。

  2. メッセージを変数設定コンポーネントに渡します。このコンポーネントは、パラメータ ​language​ でメッセージに渡される言語を変数 ​language​ に設定します。

  3. Choice ルータを使用して、各メッセージに ​language​ 属性が含まれているかどうかを確認します。この属性の存在や値によって、Choice ルータによるメッセージのルーティング方法が決まります。

    • 値が ​French​ の場合、ルータはメッセージを​「Reply in French (フランス語で返信)」​という名前の Set Payload コンポーネントにルーティングします。後者のコンポーネントは、メッセージ ​Bonjour!​ をリクエスタに返します。

    • 値が ​Spanish​ の場合、ルータはメッセージを​「Reply in Spanish (スペイン語で返信)」​という名前の Set Payload コンポーネントにルーティングします。後者のコンポーネントは、メッセージ ​Hola!​ をリクエスタに返します。

    • メッセージに ​language​ 属性が含まれていない場合、ルータはメッセージをデフォルトパスにルーティングします。デフォルトパスは、次の作業を行うサブフローです。

  4. メッセージ「No language specified. Using English as a default. (言語が指定されていません。デフォルトとして英語が使用されます。)」をコンソールに記録する。

  5. language​ の値を ​English​ に設定する。

  6. メッセージ ​Hello!​ を返す。

このサンプルプロジェクトは、フローで Choice ルータを使用してメッセージをルーティングするときに 4 つの側面を考慮する必要があることを示しています。

  • メッセージのルーティング方法を決定するために Choice ルータが評価するコンテンツ

  • ルータの数

  • デフォルトルーティングオプション

  • ルーティングオプションごとにフローで実行する処理

サンプル XML

サンプル Choice ルータの XML コードを次に示します。

<mule xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core"
	xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
	xmlns:spring="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd">
	<http:listener-config name="HTTP_Listener_config" doc:name="HTTP Listener config" >
		<http:listener-connection host="0.0.0.0" port="8081" />
	</http:listener-config>
	<flow name="content-based-routingFlow" >
		<http:listener config-ref="HTTP_Listener_config" path="/" doc:name="Listener" />
		<set-variable variableName="language" value="#[attributes.queryParams.language]" doc:name="Set Variable" />
    <!-- START OF CHOICE BLOCK-->
		<choice doc:name="Choice" >
			<when expression="#[vars.language == 'Spanish']" >
				<set-payload value="Hola!" doc:name="Reply in Spanish" />
			</when>
			<when expression="#[vars.language == 'French']" >
				<set-payload value="Bonjour!" doc:name="Reply in French" />
			</when>
			<otherwise>
				<flow-ref name="reply-in-default-languageSub_Flow" doc:name="reply-in-default-languageSub_Flow" />
			</otherwise>
		</choice>
    <!-- END OF CHOICE BLOCK-->
		<logger level="INFO" doc:name="Log the reply" message='#["The reply $(payload) means hello in $(vars.language)" ]'/>
	</flow>
  <sub-flow name="reply-in-default-languageSub_Flow" >
		<logger level="INFO" doc:name="Logger" message="No language specified. Using English as a default. "/>
		<set-variable variableName="language" value="English" doc:name="Set Language to English" />
		<set-payload value="Hello!" doc:name="Reply in English" />
	</sub-flow>
</mule>

Choice ルータ XML リファレンス

Choice フロー制御コンポーネントには次の要素が含まれます。

  • 1 つのルート要素 ​<choice>

  • 各ルーティングオプションの ​<when>​ 子要素 (それぞれに照合する式がある)

  • <when>​ 要素のどの式も ​true​ に評価されないすべてのケースを処理する Choice の ​<otherwise>​ 子要素 (省略可能)

  • 各 Choice に基づいて条件付きで実行されるコンポーネント (​when​ および ​otherwise​ 要素の子要素として定義される)

<choice> のプロパティ

プロパティ 説明

ビジネスイベント

ビジネスイベント機能をアクティブ化する場合に使用します。

<choice doc:name="Choice" tracking:enable-default-events="true" >

<when> のプロパティ

プロパティ 説明

式 (​expression​)

入力を評価する DataWeave 言語の式。
式が ​true​ に評価されると、このルーティングオプションが使用されます。

<when expression="#[vars.language == 'Spanish']" >