第6章 ルーティングコンテキストに別のルートを追加する

このチュートリアルでは、ZooOrderApp プロジェクトの blueprint.xml ファイルの Camel コンテキストに 2 番目のルートを追加する方法を説明します。2 番目のルート:

  • 最初のルートの otherwise の場合は分岐の終端から直接メッセージ (有効な注文) を受け取ります。
  • お客様の国に従って有効なメッセージを並べ替えます。
  • 各メッセージを ZooOrderApp/target/messages フォルダーの対応する フォルダーに送信します。たとえば、シカゴ動物園からの注文は USA フォルダーにコピーされます。

ゴール

このチュートリアルでは、次のタスクを完了します。

  • 2 番目のルートに直接接続するために既存のルートを再設定します
  • Camel コンテキストに 2 番目のルートを追加します
  • 最初のルートのブランチから直接メッセージを受信するように 2 番目のルートを設定します
  • コンテンツベースのルーターを 2 番目のルートに追加します
  • 2 番目のルートのコンテンツベースルーターの各出力ブランチに、メッセージヘッダー、ロギング、およびターゲット宛先を追加して設定します

前提条件

このチュートリアルを開始するには、次のいずれかの結果である ZooOrderApp プロジェクトが必要です。

既存のルートのエンドポイントを再設定する

既存のルートは、すべての有効な注文を target/messages/validOrders フォルダーに送信します。

このセクションでは、既存のルートの Otherwise _elseValid ブランチのエンドポイントを再設定して、代わりに 2 番目のルート (次のセクションで作成します) に接続します。

2 番目のルートと直接接続するように既存のルートを設定するには:

  1. ルートエディターで ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml を開きます。
  2. キャンバスで、Route_route1 コンテナーを選択して、Properties ビューでそのプロパティーを開きます。
  3. Shutdown Route プロパティーまで下にスクロールして、Default を選択します。
  4. キャンバスで、ターミナルファイルノード To_Valid を選択して、そのプロパティーを Properties ビューに表示します。
  5. Uri フィールドで既存のテキストを削除して、direct:OrderFulfillment を入力します。
  6. Id フィールドに _Fulfill を入力します。
注記

既存の To_Valid 端末ファイルノードを再使用する代わりに、ComponentsDirect コンポーネントに移動してこれを置き換えることができます (再使用する To_Valid ノードと同じプロパティー値で設定する)。

Direct コンポーネントの詳細は、Apache Camel コンポーネントリファレンス を参照してください。

2 番目のルートを追加する

ルーティングコンテキストに別のルートを追加するには:

  1. Palette で、Routing ドロワーを開き、Route ( Route icon ) パターンをクリックします。
  2. キャンバスで Route_route1 コンテナーの右をクリックします。

    tutRte2DropOnCanvas

    キャンバスで Route パターンが Route_route2 コンテナーノードになります。

  3. Route_route2 コンテナーノードをクリックして、Properties ビューでそのプロパティーを表示します。プロパティーはそのままにしておきます。
  4. ファイルを保存します。
注記

ルーティングコンテキストが複雑になるにつれて、作業中はルートエディターを個々のルートに集中させることができます。これを実行するには、Project Explorer で、ルートエディターがキャンバスで表示するルートをダブルクリックします (例: Route_route2)。

tutProjExSwitchRtesOnCanvas

キャンバスにルーティングコンテキストにあるすべてのルートを表示するには、Camel Contexts フォルダーの上部にあるプロジェクトの .xml コンテキストファイルエントリー (src/main/resources/OSGI-INF/…​) をダブルクリックします。

米国の注文を処理するための Choice ブランチの設定

このセクションでは、ルートに Choice ブランチを追加し、新しい target/messages/validOrders/USA フォルダーに USA からの注文を送信するようにルートを設定します。また、メッセージヘッダーとログファイルコンポーネントを設定します。

  1. Palette で、Components ドロワーを開き、Direct コンポーネントを選択します ( Direct icon )。
  2. キャンバスで Route_route2 コンテナーをクリックします。

    Route_route2 コンテナーが拡張し、Direct コンポーネント (From_from2 ノード) が追加されます。

    tutCBRrte2From2Add
  3. キャンバスで From_from2 ノードをクリックし、Properties ビューでそのプロパティーを開きます。
  4. Uri フィールドで、name (direct: の後) を OrderFulfillment に置き換え、Idフィールドで、_direct:OrderFulfillment と入力します。

    tutCBRrte2From2Props
  5. Palette で、Routing ドロワーを開き、Choice ( Choice icon ) パターンを選択します。
  6. キャンバスで From _direct:OrderFulfillment ノードをクリックします。

    Route_route2 コンテナーが拡張し、Choice_choice2 ノードが追加されます。

    tutCBRrte2Choice2Added

    Properties ビューで、Choice_choice2 ノードのプロパティーをそのままにしておきます。

  7. パレットで、Routing ドロワーを開き、When ( When icon ) パターンを選択します。
  8. キャンバスで Choice_choice2 ノードをクリックします。

    Choice_choice2 コンテナーが拡張し、When_when2 ノードが追加されます。

    tutCBRrte2When2Added
  9. キャンバスで When_when2 ノードを選択し、Properties ビューでそのプロパティーを開きます。
  10. When_when2 ノードのプロパティーを以下のように設定します。

    • Expression ドロップダウンリストから xpath を選択します。
    • インデントされた Expression フィールドに、/order/customer/country = 'USA' と入力します。
    • Trim を有効のままにします。
    • 2 番目の Id フィールドに _when/usa と入力します。

      tutCBRrte2WhenUSAprops
  11. Palette で、Components ドロワーを開き、File ( File icon ) コンポーネントを選択します 。
  12. キャンバスで When_when/usa コンテナーをクリックします。

    When_when/usa コンテナーが拡張し、To_to1 ノードが追加されます。

  13. Properties ビューで:

    tutRte2EndptUSA
    • Uri フィールドで、directoryNametarget/messages/validOrders/USA に置き換えます。
    • Id フィールドに _US と入力します。
  14. ファイルを保存します。

メッセージヘッダーを設定し、ログコンポーネントを追加するには:

  1. Palette で、Transformation ドロワーを開き、Set Header を選択します。
  2. キャンバスで When_when/usa ノードをクリックします。

    When_when/usa コンテナーが拡張し、SetHeader_setHeader3 ノードが追加されます。

    tutCBRrte2SetHeadUSAadd
  3. キャンバスで SetHeader_setHeader3 ノードを選択し、Properties ビューでそのプロパティーを開きます。
  4. ノードのプロパティーを次のように設定します。

    • Expression ドロップダウンメニューから、constant を選択します。
    • インデントされた Expression フィールドに USA と入力します。
    • Trim を有効のままにします。
    • Header Name フィールドに Destination と入力します。
    • 2 番目の Id フィールドに _setHead_usa と入力します。

      tutCRErte2SetHeadusaProps
  5. Palette で、Components ドロワーを開き、Log コンポーネント ( Log icon ) を選択します。
  6. キャンバスで SetHeader ノードの上をクリックします。

    When_when/usa コンテナーが拡張し、Log_log3 ノードが追加されます。

    tutCBRrte2Log3Added
  7. キャンバスで Log_log3 ノードを選択し、Properties ビューでそのプロパティーを開きます。

    tutCBRrteLog3Props
  8. Properties ビューで:

    • Message フィールドに Valid order - ship animals to USA customer と入力します。
    • Id フィールドに _usa と入力します。
    • Logging Level はそのままにします。

      tutCBRrte2Log3usaAdded
  9. ファイルを保存します。

    Route_route2 の USA ブランチは以下のようになります。

    tutUSAbranchRte2

ドイツの注文を処理するための Otherwise ブランチの設定

Route_route2 がキャンバスに表示される場合:

  1. Palette で、Routing ドロワーを開き、Otherwise のパターン ( Otherwise icon ) を選択します。
  2. キャンバスで Choice_choice2 コンテナーをクリックします。

    Choice_choice2 コンテナーが拡張し、Otherwise_otherwise1 ノードが追加されます。

    tutCBRrte2WhenGERAdd
  3. Otherwise_otherwise1 ノードを選択し、Properties ビューでそのプロパティーを開きます。
  4. Properties ビューで、Id フィールドに _else/ger と入力します。
  5. Palette で、Transformation ドロワーを開き、Set Header パターン ( Set Header icon ) を選択します。
  6. キャンバスで Otherwise_else/ger ノードをクリックします。

    Otherwise_else/ger コンテナーが拡張し、SetHeader_setHeader3 ノードが追加されます。

    tutCBRrte2SetHeadGERAdd
  7. キャンバスで SetHeader_setHeader3 ノードを選択し、Properties ビューでそのプロパティーを開きます。
  8. Properties ビューで:

    • Expression ドロップダウンリストから、constant を選択します。
    • 2 番目の Expression フィールドに Germany と入力します。
    • Trim はそのままにしておきます。
    • Header Name フィールドに Destination と入力します。
    • 2 番目の Id フィールドに _setHead_ger と入力します。
  9. Palette で、Components ドロワーを開き、Log パターン ( Log icon ) を選択します。
  10. キャンバスで、SetHeader_setHead_ger ノードの下をクリックします。

    Otherwise_else/ger コンテナーが拡張し、 Log_log3 ノードが追加されます。必要に応じて、コネクターエラーを Log_log3 ノードから SetHeader_setHead_ger ノードにドラッグします。

    tutCBRrte2LogGERAdd
  11. キャンバスで Log_log3 ノードを選択し、Properties ビューでそのプロパティーを開きます。
  12. Properties ビューで:

    • Message フィールドに Valid order - ship animals to Germany customer と入力します。
    • Id フィールドに _ger と入力します。
    • Logging Level はそのままにしておきます。
  13. Components ドロワーで File パターン ( File icon ) を選択し、Log_ger ノードの下をクリックします。

    Otherwise_else/ger コンテナーが拡張し、To_to1 ノードが追加されます。必要に応じて、コネクターエラーを SetHeader_setHead_ger ノードから To_to1 ノードにドラッグします。

    tutCBRrte2GERtermFile
  14. キャンバスで To_to1 ノードを選択し、Properties ビューでそのプロパティーを開きます。
  15. Properties ビューで:

    • Uri フィールドで、directoryNametarget/messages/validOrders/Germany に置き換えます。
    • Id フィールドに _GER と入力します。
  16. ファイルを保存します。

Route_route2 のドイツブランチは以下のようになります。

tutGERbranchRte2

2 番目のルートを確認する

キャンバス上のルートは次のようになります。

完成したルート 1

ZooOrderApp ルーティングコンテキストで完了した最初のルート

完成したルート 2

ZooOrderApp ルーティングコンテキストで完了した 2 番目のルート

キャンバスの下部にある Source タブで、camelContext 要素の XML は次のようになります。例6.1「デュアルルートコンテンツベースルーターの XML」:

例6.1 デュアルルートコンテンツベースルーターの 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" shutdownRoute="Default">
           <from id="_from1" uri="file:src/data?noop=true"/>
           <choice id="_choice1">
               <when id="_when1">
                   <xpath>/order/orderline/quantity/text() &gt; 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="_Fulfill" uri="direct:OrderFulfillment"/>
               </otherwise>
           </choice>
       </route>
       <route id="_route2">
           <from id="_direct:OrderFulfillment" uri="direct:OrderFulfillment"/>
           <choice id="_choice2">
               <when id="when/usa">
                   <xpath>/order/customer/country = 'USA'</xpath>
                   <log id="_usa" message="Valid order - ship animals to USA customer"/>
                   <setHeader headerName="Destination" id="_setHead_usa">
                       <constant>USA</constant>
                   </setHeader>
                   <to id="_US" uri="file:target/messages/validOrders/USA"/>
               </when>
               <otherwise id="_else/ger">
                   <log id="_ger" message="Valid order - ship animals to Germany customer"/>
                   <setHeader headerName="Destination" id="_setHead_ger">
                       <constant>Germany</constant>
                   </setHeader>
                   <to id="_GER" uri="file:target/messages/validOrders/Germany"/>
               </otherwise>
           </choice>
       </route>
   </camelContext>
</blueprint>
重要

ツールが shutdownRoute=" " 属性を 2 番目のルート要素 (<route id="route2">) に追加した場合は、その属性を削除します。そうしないと、ZooOrderApp プロジェクトの実行に失敗する可能性があります。

更新されたプロジェクトが期待どおりに機能することを確認するには、次の手順に従います。

  1. ZooOrderApp/Camel Contexts/blueprint.xml をローカルの Camel コンテキスト (テストなし) として実行します。
  2. コンソールの出力の終わりを確認します。次の行が表示されます。

    tutCBRrte2Console
  3. ターゲットの宛先フォルダーを確認して、ルートが正しく実行されたことを確認します。

    1. Project ExplorerZooOrderApp を右クリックし、Refresh を選択します。
    2. target/messages/ フォルダーを展開します。

      message*.xml ファイルが以下のように宛先フォルダー内で分散されるはずです。

      図6.1 プロジェクトエクスプローラーでのターゲットメッセージの宛先

      メッセージの宛先

次のステップ

次のチュートリアル 7章ルーティングコンテキストのデバッグでは、Fuse Tooling デバッガーの使用方法を学習します。