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
要素の子要素として定義される)