Choice ルーターは、メッセージコンテンツを評価する一連の DataWeave 式に従ってフローで動的にメッセージをルーティングします。各式は、異なるルーティングオプションに関連付けられます。これにより、大部分のプログラミング言語の if/then/else コードブロックのような条件付き処理がフローに追加されます。
Choice ルーターが実行するルートは 1 つのみです。つまり、最初に true と評価された式がルートの実行をトリガーし、他のルートはチェックされません。どの式も true でない場合は、デフォルトルートが実行されます。
設定
Choice ルーターを設定するには、1 つ以上の評価する条件と、いずれかの条件が true と評価された場合に実行されるメッセージプロセッサーを指定します。さらに、定義された条件がいずれも true でない場合に実行されるデフォルトルートを設定します。
Anypoint Studio 設定
Studio で Choice ルートを設定するには、次の手順に従います。

-
Choice コンポーネントをフローの任意の位置にドラッグします。
-
Choice ルーター内の [When (条件)] をクリックし、プロパティウィンドウで [Expression (式)] の値を設定して、評価する条件を指定します。
-
[When (条件)] 内にメッセージプロセッサーをドラッグして、条件を満たした場合に実行されるプロセッサーを指定します。
-
[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 ルーターまでドラッグします (黒い垂直線が表示されます)。

XML を編集してルートを追加する
XML 設定ファイルを編集して Choice ルーターにルートオプションを追加することもできます。
-
Studio で Choice ルーターを右クリックして [Go to XML… (XML へ移動…)] を選択します。
-
<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 (メッセージフロー)] ビューに表示されます。

サンプルプロジェクト
Anypoint Studio を使用して、Anypoint Exchange からサンプルプロジェクト Content-Based Routing (コンテンツベースのルーティング) をダウンロードできます。このプロジェクトでは、Choice ルーターを使用するフローの稼働サンプルが提供されます。
このサンプルプロジェクトをダウンロードして開く手順は、次のとおりです。
-
Anypoint Studio で Exchange アイコン (
) をクリックします。 -
左側のパネルで [All assets (すべてのアセット)] をクリックします。
-
開いたウィンドウで、Anypoint Exchange にログインし、サンプルプロジェクトの Content-Based Routing (コンテンツベースのルーティング) を検索します。
-
[Open (開く)] アイコン (
) をクリックします。
サンプルプロジェクトの動作
プロジェクトを Mule アプリケーションとして実行すると、アプリケーションは次のアクションを実行します。
-
メッセージをリスンします。
-
メッセージを変数設定コンポーネントに渡します。このコンポーネントは、パラメーター
language でメッセージに渡される言語を変数 language に設定します。 -
Choice ルーターを使用して、各メッセージに
language 属性が含まれているかどうかを確認します。この属性の存在や値によって、Choice ルーターによるメッセージのルーティング方法が決まります。-
値が
French の場合、ルーターはメッセージを「Reply in French (フランス語で返信)」という名前の Set Payload コンポーネントにルーティングします。後者のコンポーネントは、メッセージ Bonjour! をリクエスターに返します。 -
値が
Spanish の場合、ルーターはメッセージを「Reply in Spanish (スペイン語で返信)」という名前の Set Payload コンポーネントにルーティングします。後者のコンポーネントは、メッセージ Hola! をリクエスターに返します。 -
メッセージに
language 属性が含まれていない場合、ルーターはメッセージをデフォルトパスにルーティングします。デフォルトパスは、次の作業を行うサブフローです。
-
-
メッセージ「No language specified. Using English as a default. (言語が指定されていません。デフォルトとして英語が使用されます。)」をコンソールに記録する。
-
language の値を English に設定する。 -
メッセージ
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 要素の子要素として定義される)