Flex Gateway新着情報
Governance新着情報
Monitoring API ManagerChoice ルータは、メッセージコンテンツを評価する一連の DataWeave 式に従ってフローで動的にメッセージをルーティングします。各式は、異なるルーティングオプションに関連付けられます。これにより、大部分のプログラミング言語の if
/then
/else
コードブロックのような条件付き処理がフローに追加されます。
Choice ルータが実行するルートは 1 つのみです。つまり、最初に true
と評価された式がルートの実行をトリガし、他のルートはチェックされません。どの式も true
でない場合は、デフォルトルートが実行されます。
Choice ルータを設定するには、1 つ以上の評価する条件と、いずれかの条件が true
と評価された場合に実行されるメッセージプロセッサを指定します。さらに、定義された条件がいずれも true
でない場合に実行されるデフォルトルートを設定します。
Studio で Choice ルートを設定するには、次の手順に従います。
Choice コンポーネントをフローの任意の位置にドラッグします。
Choice ルータ内の [When (条件)] をクリックし、プロパティウィンドウで [Expression (式)] の値を設定して、評価する条件を指定します。
[When (条件)] 内にメッセージプロセッサをドラッグして、条件を満たした場合に実行されるプロセッサを指定します。
[Default (デフォルト)] 内にメッセージプロセッサをドラッグして、定義された条件をいずれも満たさなかった場合に実行されるプロセッサを指定します。
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 ルータは設定された DataWeave 式が true
に評価されると実行される 1 つのルートオプションと、既存ルートのどの式も true
に評価されなかったときに実行されるデフォルトルートを持ちます。複数の条件を評価して、成立した条件に応じて異なる操作を実行する必要がある場合は、ルートを追加してください。
Anypoint Studio の [Mule Palette (Mule パレット)] で任意のコンポーネントをクリックして、Choice ルータまでドラッグします (黒い垂直線が表示されます)。
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 ルータが評価するコンテンツ
ルータの数
デフォルトルーティングオプション
ルーティングオプションごとにフローで実行する処理
サンプル 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 フロー制御コンポーネントには次の要素が含まれます。
1 つのルート要素 <choice>
各ルーティングオプションの <when>
子要素 (それぞれに照合する式がある)
<when>
要素のどの式も true
に評価されないすべてのケースを処理する Choice の <otherwise>
子要素 (省略可能)
各 Choice に基づいて条件付きで実行されるコンポーネント (when
および otherwise
要素の子要素として定義される)