第5章 コンテンツベースのルーターの追加
このチュートリアルでは、Content-Based Router (CBR) を追加してルートにログを記録する方法を示します。
CBR は、そのコンテンツに基づいてメッセージを宛先にルーティングします。このチュートリアルでは、作成する CBR は、各メッセージの数量フィールドの値 (注文された動物の数) に基づいて、メッセージをさまざまなフォルダー (有効または無効) にルーティングします。各注文の動物の最大値は 10 です。CBR は、数量が 10 より大きいかどうかに応じて、メッセージをさまざまなフォルダーにルーティングします。例えば、ある動物園が 5 頭のシマウマを注文し、3 頭のシマウマしか入手できなかった場合、注文は無効な注文先フォルダーにコピーされます。
ゴール
このチュートリアルでは、次のタスクを完了します。
- ルートにコンテンツベースのルーターを追加します
コンテンツベースのルーターを設定します。
- コンテンツベースルーターの各出力ブランチにログエンドポイントを追加します
- 各ログエンドポイントの後に Set Header EIP を追加します
- それ以外の場合は、コンテンツベースのルーターにブランチを追加します
前提条件
このチュートリアルを開始するには、次のいずれかの結果である ZooOrderApp プロジェクトが必要です。
4章ルートの実行 チュートリアルを終了します。
または
-
2章環境の設定チュートリアルを完了し、「リソースファイルについて」に記載されているように、プロジェクトの
blueprint.xml
ファイルを、提供されるblueprintContexts/blueprint1.xml
ファイルに置き換える。
コンテンツベースルーターの追加と設定
ルートにコンテンツベースのルーターを追加して設定するには、次の手順に従います。
-
Project Explorer で
ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml
をダブルクリックして Editor ビューで開きます。 -
Design キャンバスで
To_Received
ノードを選択し、ごみ箱アイコンを選択して削除します。 Palette で Routing ドロワーを開き、Choice ( ) パターンをクリックし、(Design キャンバスで)
From_from1
ノードをクリックします。Route_route1
コンテナーが拡張し、Choice_choice1
ノードが追加されます。エラーアイコンは、Choice_choice1
ノードに子ノードが必要なことを示しています。子ノードは、次のステップで追加します。Routing ドロワーから、When ( ) パターンをクリックし、キャンバスで
Choice_choice1
ノードをクリックします。Choice_choice1
コンテナーが拡張し、When_when1
ノードが追加されます。When_when1
ノードに付随する は、1 つまたは複数の必要なプロパティー値を設定する必要があることを示しています。注記このツールは、ルートコンテナーの無効なドロップポイントにパターンを追加することを防ぎます。
キャンバスで
When_when1
ノードを選択し、Properties ビューでそのプロパティーを開きます。- Expression フィールドの ボタンをクリックして、使用可能なオプションのリストを開きます。
テストメッセージは XML で記述されているため、xpath (XML クエリー言語の場合) を選択します。
注記Expression を選択すると、Properties ビューに、Expression フィールドのすぐ下のインデントされたリストにそのプロパティーが表示されます。このインデントされたリストの Id プロパティーは、式の ID を設定します。Description フィールドに続く Id プロパティーによって
When
ノードの ID が設定されます。インデントされた Expression フィールドに、
/order/orderline/quantity/text() > 10
と入力します。この式は、quantity フィールドの値が 10 より大きいメッセージのみが、ルート内のこのパスを (invalidOrders フォルダーに) 移動することを指定します。
残りの各プロパティーはそのままにしておきます。
注記Trim オプション (デフォルトで有効) は、メッセージから先頭または末尾の空白と改行を削除します。
- ルーティングコンテキストファイルを Save します。
Source タブをクリックして、ルートの XML を表示します。
ロギングの追加と設定
ZooOrder アプリケーションの例では、ログメッセージを追加して、ルートを通過するときに XML メッセージを追跡できるようにします。ルートを実行すると、ログメッセージが Console ビューに表示されます。
次の手順に従って、CBR ルートにロギングを追加します。
- Design タブの Palette で、Components ドロワーを開き、Log コンポーネント ( ) をクリックします。
キャンバスで
When_when1
ノードをクリックします。When_when1
コンテナーが拡張し、Log_log1
ノードが追加されます。-
キャンバスで
Log_log1
ノードを選択し、Properties ビューでそのプロパティーを開きます。 Message フィールドで、
The quantity requested exceeds the maximum allowed - contact customer.
と入力します。
残りのプロパティーはそのままにしておきます。
+
ツールは、ログノード id 値を自動生成します。Fuse Integration パースペクティブの Messages ビューで、ルートでトレースが有効になっている場合、ツールはメッセージインスタンスの Trace NodeId 列にログノードの Id フィールドのコンテンツを挿入します (8章ルートを介したメッセージのトレース チュートリアルを参照してください)。Console では、ルートが実行されるたびに、ログノードの Message フィールドのコンテンツがログデータに追加されます。
- ルーティングコンテキストファイルを Save します。
メッセージヘッダーの追加と設定
メッセージヘッダーには、メッセージを処理するための情報が含まれています。
メッセージヘッダーを追加および設定するには:
- Palette で、Transformation ドロワーを開き、Set Header ( ) パターンをクリックします。
キャンバスで
Log_log1
ノードをクリックします。When_when1
コンテナーが拡張し、SetHeader_setHeader1
ノードが追加されます。キャンバスで
SetHeader_setHeader1
ノードを選択し、Properties ビューでそのプロパティーを開きます。- Expression フィールドのボタンをクリックして使用可能な言語のリストを開き、constant を選択します。
-
インデントされた Expression フィールドに
Invalid
と入力します。 -
Header Name フィールドに
Destination
と入力します。 残りのプロパティーはそのままにしておきます。
- Palette で、Components ドロワーを開き、File ( ) コンポーネントをクリックします。
キャンバスで
SetHeader_setHeader1
ノードをクリックします。When_when1
コンテナーが拡張し、To_to1
ノードが追加されます。キャンバスで
To_to1
ノードを選択し、Properties ビューでそのプロパティーを開きます。Details タブで、directoryName を Uri フィールドの
target/messages/invalidOrders
に置き換え、Id フィールドに_Invalid
と入力します。- ルーティングコンテキストファイルを Save します。
Source タブをクリックして、ルートの XML を表示します。
有効な注文を処理するためのブランチの追加と設定
これまでのところ、CBR は無効な注文 (数量の値が 10 より大きい注文) を含むメッセージを処理します。
有効な注文 (つまり、When_when1 ノードに設定された XPath 式と一致しない XML メッセージ) を処理するようにルートのブランチを追加および設定するには、次のようにします。
- Palette で、Routing ドロワーを開き、Otherwise ( ) パターンをクリックします。
キャンバスで
Choice_choice1
コンテナーをクリックします。Choice_choice1
コンテナーが拡張し、Otherwise_otherwise1
ノードが追加されます。-
キャンバスで
Otherwise_otherwise1
ノードを選択し、Properties ビューでそのプロパティーを開きます。 Id フィールドで、
_otherwise1
を_elseValid
に変更します。
それ以外のブランチのロギングを設定するには、次のようにします。
- Palette で、Components ドロワーを開き、Log ( ) コンポーネントをクリックします。
キャンバスで
Otherwise_elseValid
ノードをクリックします。Otherwise-elseValid
コンテナーが拡張し、Log_log2
ノードが追加されます。-
キャンバスで
Log_log2
ノードを選択し、Properties ビューでそのプロパティーを開きます。 Message フィールドに、
This is a valid order - OK to process.
と入力します。残りのプロパティーはそのままにしておきます。
- ルートを Save します。
それ以外のブランチのメッセージヘッダーを設定するには、次の手順に従います。
- Palette で、Transformation ドロワーを開き、Set Header パターンをクリックします。
キャンバスで
Log_log2
ノードをクリックします。Otherwise_elseValid
コンテナーが拡張し、SetHeader_setHeader2
ノードが追加されます。注記ダイアグラムが混雑したときに、コンテナーを閉じてスペースを解放できます。これを行うには、閉じるコンテナーを選択し、そのコンテナーの ボタンをクリックします。
コンテナーを再度開くには、コンテナーを選択して、 ボタンをクリックします。
Design タブでコンテナーを閉じたり開いたりしても、ルーティングコンテキストファイルには影響しません。変更はありません。
-
キャンバスで
SetHeader_setHeader2
ノードを選択し、Properties ビューでそのプロパティーを開きます。 - Expression フィールドの ボタンをクリックして、使用可能な言語のリストを開き、constant を選択します。
-
インデントされた Expression フィールドに
ReadyForDispatcher
と入力します。 -
Header Name フィールドに
Destination
と入力します。 残りのプロパティーはそのままにしておきます。
有効なメッセージのターゲットフォルダーを指定するには、次の手順に従います。
- Palette で、Components ドロワーを開き、File ( ) コンポーネントを選択します 。
キャンバスで
SetHeader_setHeader2
ノードをクリックします。Otherwise_elseValid
コンテナーが拡張し、To_to1
ノードが追加されます。-
キャンバスで
To_to1
ノードを選択し、Properties ビューでそのプロパティーを開きます。 URI フィールドの directoryName を
target/messages/validOrders
に置き換え、Id フィールドに_Valid
と入力します。ルーティングコンテキストファイルを Save します。
完成したコンテンツベースのルーターは次のようになります。
キャンバスの左下にある Source タブをクリックして、ルートの XML を表示します。
<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd"> <camelContext id="_context1" xmlns="http://camel.apache.org/schema/blueprint"> <route id="_route1"> <from id="_from1" uri="file:src/data?noop=true"/> <choice id="_choice1"> <when id="_when1"> <xpath>/order/orderline/quantity/text() > 10</xpath> <log id="_log1" message="The quantity requested exceeds the maximum allowed - contact customer."/> <setHeader headerName="Destination" id="_setHeader1"> <constant>Invalid</constant> </setHeader> <to id="_Invalid" uri="file:target/messages/invalidOrders"/> </when> <otherwise id="_elseValid"> <log id="_log2" message="This is a valid order - OK to process."/> <setHeader headerName="Destination" id="_setHeader2"> <constant>ReadyForDispatcher</constant> </setHeader> <to id="_Valid" uri="file:target/messages/validOrders"/> </otherwise> </choice> </route> </camelContext> </blueprint>
CBR の検証
「ルートを実行する」チュートリアルで説明したように新しいルートを実行し、Console ビューでログメッセージを確認することができます。
実行後、ルートが正しく実行されたかどうかを確認するには、Project Explorer でターゲットの宛先フォルダーを確認します。
-
ZooOrderApp
を選択します。 - それを右クリックしてコンテキストメニューを開き、Refresh を選択します。
プロジェクトの root ノード (
ZooOrderApp
) でtarget/messages/
フォルダーを見つけ、展開します。target/messages/invalidOrders
フォルダーにmessage1.xml
およびmessage3.xml
が含まれることを確認します。これらのメッセージでは、
quantity
要素の値は 10 を超えます。target/messages/validOrders
フォルダーに有効な注文が含まれる 4 つのメッセージファイルが含まれていることを確認します。-
message2.xml
-
message4.xml
-
message5.xml
message6.xml
これらのメッセージでは、
quantity
要素の値は 10 以下です。注記メッセージの内容を表示するには、各メッセージをダブルクリックして、ルートエディターの XML エディターで開きます。
-
次のステップ
次のチュートリアル 6章ルーティングコンテキストに別のルートを追加する では、有効な注文メッセージをさらに処理する 2 番目のルートを追加します。