Menu Close
Tooling のチュートリアル
CodeReady Studio における Fuse Tooling の使用例
概要
本ガイドには、Red Hat Fuse Tooling が提供するツールを使用してアプリケーションを開発およびテストする方法を示す簡単なチュートリアルが多数含まれています。多様性を受け入れるオープンソースの強化
Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、CTO である Chris Wright のメッセージ をご覧ください。
第1章 Fuse Tooling のチュートリアルについて
Red Hat Fuse Tooling のチュートリアルは、Fuse Tooling を使用して Apache Camel アプリケーションの開発、実行、テスト、およびデプロイを行うためのハンズオンの基礎を提供します。
前提条件
開始する前に、以下のソフトウェアについて理解しておく必要があります。
Fuse Tooling チュートリアルの概要
チュートリアルの概要およびそれぞれのチュートリアルの目的を以下に示します。
Fuse Integration プロジェクトを作成し、チュートリアルのリソースファイル (メッセージおよびルーティングコンテキストファイルのサンプル) を設定する。プロジェクトの作成時に、ルーティングコンテキストとメインのルートが自動作成されます。
フォルダーからメッセージを取得し、別のフォルダーにコピーする単純なルートのエンドポイントを定義する。
テストメッセージを表示する。ルートを実行し、テストメッセージがソースフォルダーからターゲットフォルダーにコピーされたことを確認して、これが機能することを確認します。
メッセージをフィルタリングして、メッセージのコンテンツに基づいて異なるターゲットフォルダーにコピーするコンテンツベースルーターを追加する。
メッセージをさらにフィルタリングして、メッセージのコンテンツに基づいて異なるターゲットフォルダーにコピーする新たなルートを追加する。
Camel デバッガーを使用してブレークポイントを設定し、ルートを介してルートおよびメッセージ変数を調べる。
ルートにメッセージをドロップし、すべてのルートノードを介してトラッキングする。
ルートの JUnit テストケースを作成し、ルートをテストする。
10章Red Hat Fuse へのプロジェクトのパブリッシュ
Apache Camel プロジェクトを Red Hat Fuse にパブリッシュするプロセスを順を追って実行する: ローカルサーバーを定義し、パブリッシュオプションを設定し、サーバーを起動し、プロジェクトをパブリッシュし、サーバーに接続し、プロジェクトが正常にビルドおよびパブリッシュされたことを確認します。
Fuse Tooling 機能の詳細は、『Tooling User Guide』を参照してください。
サンプルアプリケーションについて
Fuse Tooling のチュートリアルでビルドするサンプルアプリケーションは、動物園が動物をオーダーする単純な注文アプリケーションを模擬しています。サンプル XML メッセージが提供されます。各 XML メッセージには、顧客情報 (動物園の名前、都市、および国) と注文情報 (要求した動物のタイプおよび数、ならびに動物の最大許容数) が含まれます。
Fuse Tooling を使用して、受信サンプルメッセージを受け取り、コンテンツでフィルターし (有効な注文/無効な注文)、動物園の場所 (国) で有効なオーダーをさらに並べ替える Blueprint プロジェクトを作成します。チュートリアルの後半では、サンプルアプリケーションを使用してルーティングコンテキストをデバッグし、ルート経由でメッセージを追跡し、JUnit でルートをテストし、最後に Fuse プロジェクトをパブリッシュします。
リソースファイルについて
各チュートリアルは、直前のチュートリアルに結果に基づいて構成されます。チュートリアルを順番に完了できるように、あるチュートリアルによって生成されたコードは、次のチュートリアルの開始点になります。または、最初のチュートリアルを完了した後に、提供されたコンテキストファイルの 1 つを開始点として使用し、シーケンスの他のチュートリアルを実行することもできます。
チュートリアルは、ここ にある Fuse-tooling-tutorials-jbds-10.3.zip
ファイルにあるリソースファイルに依存します。この zip ファイルには、以下の 2 つのフォルダーが含まれます。
- メッセージ
-
このフォルダーには、
message1.xml
、message2.xml
、およびmessage6.xml
という名前の 6 つのメッセージファイルが含まれます。最初のチュートリアル「2章環境の設定」では、これらのメッセージファイルを保存するディレクトリーを作成し、それらのコンテンツも表示します。すべてのチュートリアルにこれらのメッセージファイルが必要です。 - blueprintContexts
このフォルダーには、3 つのルーティングコンテキストファイルが含まれます。
Blueprint1.xml
: これは、「3章ルートの定義」のチュートリアルを完了することで得られるソリューションルーティングコンテキストです。これを、以下のチュートリアルの開始点として使用できます。-
Blueprint2.xml
: これは、「5章コンテンツベースルーターの追加」チュートリアルのソリューションコンテキストファイルです。blueprint2.xml
を、「6章ルーティングコンテキストへの別のルートの追加」チュートリアルの開始点として使用できます。 Blueprint3.xml
: これは、「6章ルーティングコンテキストへの別のルートの追加」チュートリアルのソリューションコンテキストファイルです。blueprint3.xml
を、以下のチュートリアルの開始点として使用できます。
第2章 環境の設定
このチュートリアルでは、Fuse Integration プロジェクトを作成するプロセスについて順を追って説明します。このプロジェクトには、初期ルートとデフォルトの CamelContext が含まれます。ルートは、メッセージが移動するプロセッサーチェーンです。CamelContext は単一のルーティングルールベースで、ルート設定用のコンテキストを定義し、エンドポイント (メッセージソースとターゲット) 間のメッセージ交換時に使用するポリシーを指定します。
他のチュートリアルを実行する前に、このチュートリアルを完了する必要があります。
ゴール
このチュートリアルでは、以下のタスクを実行します。
- Fuse Integration プロジェクトを作成する
- プロジェクトのテストメッセージ (XML ファイル) をダウンロードする
- テストメッセージを表示する
操作を始める前に
Fuse Integration プロジェクトを設定するには、Fuse Tooling を使用して Red Hat CodeReady Studio をインストールする必要があります。CodeReady Studio のインストール方法については、Red Hat カスタマーポータル からお使いのプラットフォームのインストールガイドを参照してください。
「10章Red Hat Fuse へのプロジェクトのパブリッシュ」チュートリアルの手順を実行するには、Java 8 をインストールする必要があります。
Fuse Integration プロジェクトの作成
Red Hat CodeReady Studio を開きます。
CodeReady Studio を初めて起動すると、JBoss パースペクティブで開きます。
それ以外の場合は、以前の CodeReady Studio セッションで使用していたパースペクティブで開きます。
メニューから File → New → Fuse Integration Project を選択し、New Fuse Integration Project ウィザードを開きます。
Project Name フィールドに
ZooOrderApp
を入力します。Use default workspace location オプションをチェックしたままにします。
Next をクリックし、Select a Target Runtime ページを開きます。
- Standalone をデプロイメントプラットフォームに選択します。
Karaf/Fuse on Karaf を選択して、ランタイムに None selected を受け入れます。
注記後の「10章Red Hat Fuse へのプロジェクトのパブリッシュ」のチュートリアルで、このランタイムを追加します。
デフォルトの Apache Camel バージョン を受け入れます。
Next をクリックして Advanced Project Setup ページを開き、Empty - Blueprint DSL テンプレートを選択します。
Finish をクリックします。
Fuse Tooling は、プロジェクトをビルドするのに必要なすべてのファイルを Maven レポジトリーからダウンロードし始め、新しいプロジェクトを Project Explorer ビューに追加します。
CodeReady Studio で Fuse Integration パースペクティブが表示されていない場合は、すぐに切り替えるかどうかを尋ねられます。
Yes をクリックします。
Fuse Integration パースペクティブに、新しい ZooOrderApp プロジェクトが開きます。
ZooOrderApp プロジェクトに は、以下を含むルートを作成して実行するために必要なすべてのファイルが含まれます。
ZooOrderApp/pom.xml
: Maven プロジェクトファイル-
ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml
: Camel ルーティングコンテキストと初期の空のルートが含まれる Blueprint XML ファイル。
メインのルーティングコンテキストを表示するには、Editor ビューで
blueprint.xml
ファイルを開き、Source タブをクリックします。
ID 値を表示するためのコンポーネントラベルの設定
Design キャンバスに配置するパターンおよびコンポーネントのラベルが、Tooling のチュートリアルに表示されるラベルと同じになるようにするには、以下の手順を実施します。
Editor の設定ページを開きます。
- Linux および Windows マシンでは、Windows → Preferences → Fuse Tooling → Editor と選択します。
- OS X では、CodeReady Studio → Preferences → Fuse Tooling → Editor と選択します。
Use ID values for all component labels オプションをチェックします。
- Apply and Close をクリックします。
プロジェクトのテストメッセージのダウンロード
Tooling のチュートリアルを使用して作業する際に、ZooOrderApp プロジェクトをテストできるように、XML メッセージファイルのサンプルが提供されます。メッセージには、動物園の動物の注文情報が含まれます。たとえば、Chicago 動物園からのウォンバット 5 頭の注文です。
提供されたテストメッセージ (XML ファイル) をプロジェクトにダウンロードしてコピーするには、以下の手順を実施します。
CodeReady Studio の Project Explorer ビューで、テストメッセージを含めるフォルダーを作成します。
-
ZooOrderApp/src
フォルダーを右クリックし、New → Folder を選択します。New Folder ウィザードが開きます。 -
Folder name に
data
と入力します。 - Finish をクリックします。
-
こちら をクリックして、提供される Tooling チュートリアルのリソース
Fuse-tooling-tutorials-jbds-10.3.zip
ファイルの場所に対して Web ブラウザーを開きます。Fuse-tooling-tutorials-jbds-10.3.zip
ファイルを、ZooOrderApp プロジェクトのワークスペースの外部にある便利な場所にダウンロードし、展開します。「1章Fuse Tooling のチュートリアルについて」で説明されているように、フォルダーが 2 つ含まれます。messages フォルダーから、6 つの XML ファイルを ZooOrderApp プロジェクトの
src/data
フォルダーにコピーします。注記XML ファイルの
は無視しても問題ありません。
テストメッセージの表示
各 XML メッセージファイルには、動物園 (顧客) からの動物のの量に関する注文が含まれます。たとえば、「message1.xml」ファイルには、Brooklyn 動物園からの 12 頭のウォンバット関する注文が含まれています。
Editor ビューでメッセージ XML ファイルを開いて、コンテンツを調べることができます。
- Project Explorer ビューで、メッセージファイルを右クリックします。
- ポップアップメニューから Open を選択します。
Source タブをクリックします。
Editor ビューで XML ファイルが開きます。
たとえば、
message1.xml
ファイルの内容には、Brooklyn 動物園からの 12 頭のウォンバットに関する注文が表示されます。<?xml version="1.0" encoding="UTF-8"?> <order> <customer> <name>Bronx Zoo</name> <city>Bronx NY</city> <country>USA</country> </customer> <orderline> <animal>wombat</animal> <quantity>12</quantity> </orderline> </order>
新しく作成した message1.xml
ファイルの最初の行にある
を無視しても問題ありません。これは、ドキュメントが参照する文法制約(DTD または XML スキーマ)が存在していないことが推奨されます。
以下の表は、6 つすべてのメッセージファイルの内容の概要を示しています。
表2.1 提供されるテストメッセージ
メッセージ No. | <name> | <city> | <country> | <animal> | <quantity> |
---|---|---|---|---|---|
1 | Bronx 動物園 | Bronx NY | 米国 | ウォンバット | 12 |
2 | SAN Diego 動物園 | SAN Diego CA | 米国 | キリン | 3 |
3 | Sea Life Centre | Munich | ドイツ | ペンギン | 15 |
4 | Berlin 動物園 | Berlin | ドイツ | エミュー | 6 |
5 | Philadelphia 動物園 | Philapelphia PA | 米国 | キリン | 2 |
6 | st Louis 動物園 | st Loius MO | 米国 | ペンギン | 10 |
次のステップ
CodeReady Studio プロジェクトを設定したので、XML メッセージを処理するルートを定義する「3章ルートの定義」のチュートリアルを続けることができます。
第3章 ルートの定義
このチュートリアルでは、ルートへのエンドポイントの追加および設定について順を追って説明します。エンドポイントは、ルートを移動するメッセージのソースおよびシンクを定義します。ZooOrderApp
プロジェクトでは、開始 (ソース) エンドポイントは XML メッセージファイルを含むフォルダーです。シンク (終了) エンドポイントは、プロジェクトに指定する別のフォルダーです。
ゴール
このチュートリアルでは、以下のタスクを実行します。
- ソースおよびシンクエンドポイントをルートに追加する
- エンドポイントを設定する
- エンドポイントを接続する
作業を始める前に
このチュートリアルを開始する前に:
- 「2章環境の設定」チュートリアルで説明されているように、ワークスペース環境を設定する必要があります。
-
CodeReady Studio で、
ZooOrderApp
プロジェクトの/src/main/resources/OSGI-INF/blueprint/blueprint.xml
ファイルを Editor ビューで開きます。 -
必要に応じて、Editor ビューの下部にある Design タブをクリックして、
Route_route1
というラベルが付けられた初期ルートのグラフを表示します。
ソースエンドポイントの設定
以下の手順に従って、src/data
フォルダーをルートのソースエンドポイントとして設定します。
Palette 'sComponents drawer から File コンポーネント(
)をキャンバスにドラッグし、
Route_route1
コンテナーノードでドロップします。File コンポーネントは、
Route_route1
コンテナーノード内のFrom _from1
ノードに変更されます。キャンバスで
From _from1
ノードを選択します。キャンバスの下の Properties ビューには、編集用にノードのプロパティーフィールドが表示されます。
メッセージファイルのソースディレクトリーを指定するには、Properties ビューで Advanced タブをクリックします。
Directory Name フィールドに
src/data
を入力します。src/data
は、プロジェクトのディレクトリーからの相対パスです。Consumer タブで、Noop オプションにチェックを入れて有効にします。
Noop オプションにより、
message#.xml
ファイルがsrc/data
フォルダーから削除されなくなり、べき等を有効にして各message#.xml
ファイルが 1 度だけ消費されるようにします。Details タブを選択して、ファイルノードの Details ページを開きます。
このツールは、Uri フィールドに、Advanced タブで設定した Directory Name および Noop プロパティーを自動的に設定することに注意してください。また、Id フィールドに自動生成される ID (
_from1
) も設定します。注記ツールプレフィックスは、自動生成されるアンダースコア (_) の付いた ID 値です。必要に応じて、ID の値を変更できます。アンダースコアのプレフィックスは必須ではありません。
自動生成される ID はそのまま残します。
- File → Save を選択してルートを保存します。
シンクエンドポイントの設定
ルートのシンク (ターゲット) エンドポイントを追加および設定するには、以下を行います。
別の File コンポーネントをPalette の Components ドロワーからドラッグし、それを
Route_route1
コンテナーノードにドロップします。File コンポーネントは、
Route_route1
コンテナーノード内のTo_to1
ノードに変更されます。キャンバスで
To_to1
ノードを選択します。キャンバスの下の Properties ビューには、編集用にノードのプロパティーフィールドが表示されます。
Details タブで以下の操作を行います。
-
Uri フィールドに
file:target/messages/received
を入力します。 Id フィールドに
_Received
を入力します。注記ツールは、実行時に
target/messages/received
フォルダーを作成します。
-
Uri フィールドに
Route_route1
コンテナーで From _from1 ノードを選択し、To_Received ノードからコネクター矢印()をドラッグし、解放します。
注記2 つのファイルノードが接続され、ルートエディターのレイアウト方向設定に従ってキャンバスに調整されます。選択肢は Down (デフォルト) と Right です。
ルートエディターのレイアウト設定オプションにアクセスするには、以下を実行します。
- Linux および Windows マシンでは、Windows → Preferences → Fuse Tooling → Editor → Choose the layout direction for the diagram editor と選択します。
- OS X では、CodeReady Studio → Preferences → Fuse Tooling → Editor → Choose the layout direction for the diagram editor と選択します。
注記プロジェクトを閉じる前にノードを接続しないと、プロジェクトを再度開く際にツールが自動的に接続します。
- ルートを 保存 します。
キャンバスの下部にある 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"/> <to id="_Received" uri="file:target/messages/received"/> </route> </camelContext> </blueprint>
次のステップ
ルートにエンドポイントを追加および設定したので、「4章ルートの実行」チュートリアルで説明されているようにルートを実行できます。
第4章 ルートの実行
このチュートリアルでは、ルートを実行して、ルートがソースエンドポイントからシンクエンドポイントにメッセージを正しく転送することを確認するプロセスについて順を追って説明します。
ゴール
このチュートリアルでは、以下のタスクを実行します。
- ローカルの Camel コンテキストとしてルートを実行する (テストがまだ設定されていないため、テストは行わない)
- ルートを通じてメッセージを送信する
- シンクエンドポイントによって受信されたメッセージを検査し、ルートがテストメッセージを正しく処理したことを確認する
前提条件
このチュートリアルを開始するには、以下のいずれかによる ZooOrderApp プロジェクトが必要です。
- 「2章環境の設定」チュートリアルを完了する。
以下のいずれか:
「3章ルートの定義」チュートリアルを完了する。
あるいは、
-
「リソースファイルについて」に記載されているように、プロジェクトの
blueprint.xml
ファイルを、提供されるblueprintContexts/blueprint1.xml
ファイルに置き換える。
ルートの実行
ルートを実行するには、以下を実行します。
-
ZooOrderApp
プロジェクトを開きます。 Project Explorer で
ZooOrderApp/Camel Contexts/blueprint.xml
を選択します。blueprint.xml
を右クリックし、Run As → Local Camel Context (without tests) を選択します。注記代わりに Local Camel Context を選択すると、ツールは自動的に指定された JUnit テストに対してルーティングコンテキストを実行しようとします。JUnit テストは存在しません。そのため、ツールはテストのないルーティングコンテキストの実行に戻します。「9章JUnit を使用したルートのテスト」チュートリアルで、JUnit テストケースを作成して ZooOrderApp プロジェクトをテストします。
Console パネルが開き、プロジェクトの実行の進捗を反映するログメッセージが表示されます。開始時に、Maven はローカルの Maven リポジトリーを更新するために必要なリソースをダウンロードします。Maven のダウンロードプロセスには数分かかる場合があります。
出力の最後に (以下のような) メッセージが表示されるまで待ちます。これらのメッセージは、ルートが正常に実行されたことを示しています。
... [Blueprint Event Dispatcher: 1] BlueprintCamelContext INFO Route: _route1 started and consuming from:Endpoint[file://src/data?noop=true] [Blueprint Event Dispatcher: 1] BlueprintCamelContext INFO Total 1 routes, of which 1 are started. [Blueprint Event Dispatcher: 1]BlueprintCamelContext INFO Apache Camel 2.21.0.redhat-3 (CamelContext: ...) started in 0.163 seconds [Blueprint Event Dispatcher: 1] BlueprintCamelContext INFO Apache Camel 2.21.0.redhat-3 (CamelContext: ...) started in 0.918 seconds
-
ルートをシャットダウンするには、Console ビューの上部にある
をクリックします。
ルートの確認
ルートが適切に実行されたことを確認するには、メッセージ XML ファイルがソースフォルダー (src/data
) からターゲットフォルダー (target/messages/received
) にコピーされたかどうかを確認します。
-
Project Explorer で
ZooOrderApp
を選択します。 - 右クリックし、Refresh を選択します。
Project Explorer で
target/messages/
フォルダーを見つけ、これを展開し、target/messages/received
フォルダーに 6 つのメッセージファイル (message1.xml
からmessage6.xml
) が含まれることを確認します。message1.xml
をダブルクリックして、ルートエディターの Design タブでそれを開き、Source タブを選択して XML コードを表示します。<?xml version="1.0" encoding="UTF-8"?> <order> <customer> <name>Bronx Zoo</name> <city>Bronx NY</city> <country>USA</country> </customer> <orderline> <animal>wombat</animal> <quantity>12</quantity> </orderline> </order>
次のステップ
「5章コンテンツベースルーターの追加」チュートリアルで、メッセージのコンテンツを使用して宛先を決定するコンテンツベースルーターを追加します。
第5章 コンテンツベースルーターの追加
本チュートリアルでは、コンテンツベースルーター (CBR) を追加し、ルートにロギングする方法を説明します。
CBR は、メッセージをそのコンテンツに基づいて宛先にルーティングします。このチュートリアルでは、各メッセージの数量フィールドの値 (注文の動物の数) に基づいて、作成する CBR がメッセージを異なるフォルダー (有効または無効) にルーティングします。各注文の動物の最大値は 10 です。数量が 10 よりも大きいかどうかに応じて、CBR はメッセージを異なるフォルダーにルーティングします。たとえば、動物園はシマウマ 5 頭を注文したが 3 頭のシマウマしかいない場合、注文が無効な注文のターゲットフォルダーにコピーされます。
ゴール
このチュートリアルでは、以下のタスクを実行します。
- コンテンツベースルーターをルートに追加する
コンテンツベースルーターを設定する
- コンテンツベースルーターの各出力ブランチにログエンドポイントを追加する
- 各ログエンドポイントの後に Set Header EIP を追加する
- コンテンツベースルーターに Otherwise ブランチを追加する
前提条件
このチュートリアルを開始するには、以下のいずれかによる 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
ノードに子ノードが必要なことを示しています。子ノードは、次のステップで追加します。ルーティングドロワーから When (
)パターンをクリックし、キャンバスで
Choice_choice1
ノードをクリックします。Choice_choice1
コンテナーが展開され、When_when1
ノードが追加されます。を
When_when1
ノードを切り離すると、必要な 1 つ以上の必須プロパティー値が設定される必要があることを示します。注記ツールは、Route コンテナーの無効なドロップポイントにパターンが追加されるのを防ぎます。
キャンバスで
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 オプション (デフォルトで有効) は、メッセージの最初または末尾の空白および改行を削除します。
- ルーティングコンテキストファイルを 保存 します。
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 値を自動的に生成します。ルートでトレースが有効になっている場合 (「8章ルートを通じたメッセージのトレース」のチュートリアルを参照)、Fuse Integration パースペクティブの Messages ビューで、ツールはログノードの Id フィールドの内容をメッセージインスタンスの Trace Node Id 列に挿入します。ルートが実行されるたびに、コンソール で、ログノードの Message フィールドの内容がログデータに追加されます。
- ルーティングコンテキストファイルを 保存 します。
メッセージヘッダーの追加および設定
メッセージヘッダーにはメッセージを処理するための情報が含まれます。
メッセージヘッダーを追加および設定するには、以下を実行します。
-
Palette で Transformation ドロワーを開き、Set Header (
)パターンをクリックします。
キャンバスで
Log_log1
ノードをクリックします。When_when1
コンテナーが展開され、SetHeader_setHeader1
ノードが追加されます。キャンバスで
SetHeader_setHeader1
ノードを選択し、Properties ビューでそのプロパティーを開きます。-
Expression フィールドの
ボタンをクリックして利用可能な言語のリストを開き、定数を選択します。
-
インデントされた 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
と入力します。- ルーティングコンテキストファイルを 保存 します。
Source タブをクリックして、ルートの XML を表示します。
有効な注文を処理するブランチの追加および設定
今のところ、CBR は無効な注文 (数量の値が 10 よりも大きい注文) が含まれるメッセージを処理します。
有効な注文 (When_when1 ノードに設定された XPath 式に一致しないすべての XML メッセージ) を処理するために、ルートの Otherwise ブランチを追加および設定するには、以下を実行します。
-
Palette で Routing ドロワーを開き、一覧から実行 (
)パターンをクリックします。
キャンバスで
Choice_choice1
コンテナーをクリックします。Choice_choice1
コンテナーが展開され、Otherwise_otherwise1
ノードが追加されます。-
キャンバスで
Otherwise_otherwise1
ノードを選択し、Properties ビューでそのプロパティーを開きます。 Id フィールドで、
_otherwise1
を_elseValid
に変更します。
Otherwise ブランチのロギングを設定するには、以下を実行します。
-
Palette で Components ドロワーを開き、Log (
)コンポーネントをクリックします。
キャンバスで
Otherwise_elseValid
ノードをクリックします。Otherwise-elseValid
コンテナーが展開され、Log_log2
ノードが追加されます。-
キャンバスで
Log_log2
ノードを選択し、Properties ビューでそのプロパティーを開きます。 Message フィールドに
This is a valid order - OK to process.
と入力します。残りのプロパティーはそのままにしておきます。
- ルートを 保存 します。
Otherwise ブランチにメッセージヘッダーを設定するには、以下を実行します。
- Palette で Transformation ドロワーを開き、Set Header パターンをクリックします。
キャンバスで
Log_log2
ノードをクリックします。Otherwise_elseValid
コンテナーが展開され、SetHeader_setHeader2
ノードが追加されます。注記多数のダイアグラムが表示されるようになったら、コンテナーを折りたたんでスペースを作ることができます。これを行うには、折りたたむコンテナーを選択し、その
ボタンをクリックします。
コンテナーを再度開き、これを選択してから
ボタンをクリックします。
Design タブでコンテナーを折りたたんだり展開したりしても、ルーティングコンテキストファイルには影響がありません。変更されないままです。
-
キャンバスで
SetHeader_setHeader2
ノードを選択し、Properties ビューでそのプロパティーを開きます。 -
Expression フィールドの
ボタンをクリックして利用可能な言語のリストを開き、定数を選択します。
-
インデントされた Expression フィールドに
ReadyForDispatcher
と入力します。 -
Header Name フィールドに
Destination
と入力します。 残りのプロパティーはそのままにしておきます。
有効なメッセージのターゲットフォルダーを指定するには、以下を実行します。
-
Palette で Components ドロワーを開き、File (
)コンポーネントを選択します。
キャンバスで
SetHeader_setHeader2
ノードをクリックします。Otherwise_elseValid
コンテナーが展開され、To_to1
ノードが追加されます。-
キャンバスで
To_to1
ノードを選択し、Properties ビューでそのプロパティーを開きます。 URI フィールドの directoryName を
target/messages/validOrders
に置き換え、Id フィールドに_Valid
と入力します。ルーティングコンテキストファイルを 保存 します。
設定の完了したコンテンツベースルーターは、以下のようになります。
キャンバスの左下にある 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 番目のルートを追加します。
第6章 ルーティングコンテキストへの別のルートの追加
このチュートリアルでは、ZooOrderApp
プロジェクトの blueprint.xml
ファイルの Camel コンテキストに 2 番目のルートを追加する方法を説明します。2 番目のルートは以下の処理を行います。
- 最初のルートの Otherwise ブランチの終端から直接メッセージ (有効な注文) を取得する。
- 顧客の国に応じて有効なメッセージを並べ替える。
-
各メッセージを
ZooOrderApp/target/messages
フォルダーの該当するcountry
フォルダーに送信する。たとえば、Chicago 動物園からの注文は USA フォルダーにコピーされます。
ゴール
このチュートリアルでは、以下のタスクを実行します。
- 2 番目のルートへの直接接続のために既存のルートを再設定する
- Camel コンテキストに 2 番目のルートを追加する
- 最初のルートの Otherwise ブランチから直接メッセージを取得するように 2 番目のルートを設定する
- コンテンツベースルーターを 2 番目のルートに追加する
- メッセージヘッダー、ロギング、およびターゲットの宛先を 2 番目のルートのコンテンツベースルーターの各出力ブランチに追加および設定する
前提条件
このチュートリアルを開始するには、以下のいずれかによる ZooOrderApp プロジェクトが必要です。
「5章コンテンツベースルーターの追加」チュートリアルを完了する。
あるいは、
-
「2章環境の設定」チュートリアルを完了し、「リソースファイルについて」に記載されているように、プロジェクトの
blueprint.xml
ファイルを、提供されるblueprintContexts/blueprint2.xml
ファイルに置き換える。
既存のルートのエンドポイントの再設定
既存のルートは、すべての有効な注文を target/messages/validOrders
フォルダーに送信します。
このセクションでは、既存のルートのエンドポイント Otherwise _elseValid ブランチを再設定し、代わりに (次のセクションで作成する) 2 番目のルートに接続します。
2 番目のルートに直接接続するように既存のルートを設定するには、以下を実行します。
-
ルートエディターで
ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml
を開きます。 - キャンバスで Route_route1 コンテナーを選択し、Properties ビューでそのプロパティーを開きます。
- Shutdown Route プロパティーまでスクロールダウンし、Default を選択します。
- キャンバスで終端ファイルノード To_Valid を選択し、そのプロパティーを Properties ビューで表示します。
-
Uri フィールドで既存のテキストを削除して、
direct:OrderFulfillment
を入力します。 -
Id フィールドに
_Fulfill
を入力します。
既存の To_Valid
端末ファイルノードを再使用する代わりに、Components → Direct コンポーネントに移動してこれを置き換えることができます (再使用する To_Valid
ノードと同じプロパティー値で設定する)。
Direct コンポーネントの詳細は、『Apache Camel Component Reference』を参照してください。
2 番目のルートの追加
別のルートをルーティングコンテキストに追加するには、以下の手順を実施します。
-
Palette で Routing ドロワーを開き、Route (
)パターンをクリックします。
キャンバスで
Route_route1
コンテナーの右をクリックします。キャンバスで Route パターンが
Route_route2
コンテナーノードになります。-
Route_route2
コンテナーノードをクリックして、Properties ビューでそのプロパティーを表示します。プロパティーはそのままにしておきます。 - ファイルを 保存 します。
ルーティングコンテキストが複雑になると、作業中にルートエディターを個々のルートに集中させる必要がある場合があります。これを実行するには、Project Explorer で、ルートエディターがキャンバスで表示するルートをダブルクリックします (例: Route_route2
)。

キャンバスのルーティングコンテキストにあるすべてのルートを表示するには、Camel Contexts
フォルダーの上部にあるプロジェクトの .xml
コンテキストファイルエントリー(src/main/resources/OSGI-INF/…
)をダブルクリックします。
USA の注文を処理する Choice ブランチの設定
このセクションでは、ルートに Choice ブランチを追加し、新しい target/messages/validOrders/USA
フォルダーに USA からの注文を送信するようにルートを設定します。メッセージヘッダーとログファイルコンポーネントも設定します。
-
Palette で Components ドロワーを開き、Direct コンポーネントを選択します(
)。
キャンバスで
Route_route2
コンテナーをクリックします。Route_route2
コンテナーが拡張し、Direct コンポーネント (From_from2
ノード) が追加されます。-
キャンバスで
From_from2
ノードをクリックし、Properties ビューでそのプロパティーを開きます。 Uri フィールドの
name
(direct:
の後) をOrderFulfillment
に置き換え、Id フィールドに_direct:OrderFulfillment
と入力します。-
Palette で Routing ドロワーを開き、Choice (
)パターンを選択します。
キャンバスで
From _direct:OrderFulfillment
ノードをクリックします。Route_route2
コンテナーが展開され、Choice_choice2
ノードが追加されます。Properties ビューで、
Choice_choice2
ノードのプロパティーをそのままにしておきます。-
Palette で Routing ドロワーを開き、When (
)パターンを選択します。
キャンバスで
Choice_choice2
ノードをクリックします。Choice_choice2
コンテナーが展開され、When_when2
ノードが追加されます。-
キャンバスで
When_when2
ノードを選択し、Properties ビューでそのプロパティーを開きます。 When_when2
ノードのプロパティーを以下のように設定します。- Expression ドロップダウンリストから xpath を選択します。
-
インデントされた Expression フィールドに
/order/customer/country = 'USA'
と入力します。 - Trim は有効のままにします。
2 番目の Id フィールドに
_when/usa
と入力します。
-
Palette で Components ドロワーを開き 、File コンポーネント(
)を選択します。
キャンバスで
When_when/usa
コンテナーをクリックします。When_when/usa
コンテナーが展開され、To_to1
ノードが追加されます。Properties ビューで、以下を実行します。
-
Uri フィールドで、
directoryName
をtarget/messages/validOrders/USA
に置き換えます。 -
Id フィールドに
_US
と入力します。
-
Uri フィールドで、
- ファイルを 保存 します。
メッセージヘッダーを設定し、ログコンポーネントを追加するには、以下を実行します。
- Palette で Transformation ドロワーを開き、Set Header パターンを選択します。
キャンバスで
When_when/usa
ノードをクリックします。When_when/usa
コンテナーが展開され、SetHeader_setHeader3
ノードが追加されます。-
キャンバスで
SetHeader_setHeader3
ノードを選択し、Properties ビューでそのプロパティーを開きます。 ノードのプロパティーを以下のように設定します。
- Expression ドロップダウンメニューから、constant を選択します。
-
インデントされた Expression フィールドに
USA
と入力します。 - Trim は有効のままにします。
-
Header Name フィールドに
Destination
と入力します。 2 番目の Id フィールドに
_setHead_usa
と入力します。
-
Palette で Components ドロワーを開き 、Log コンポーネント(
)を選択します。
キャンバスで
SetHeader
ノードの上をクリックします。When_when/usa
コンテナーが展開され、Log_log3
ノードが追加されます。キャンバスで
Log_log3
ノードを選択し、Properties ビューでそのプロパティーを開きます。Properties ビューで、以下を実行します。
-
Message フィールドに
Valid order - ship animals to USA customer
と入力します。 -
Id フィールドに
_usa
と入力します。 Logging Level はそのままにします。
-
Message フィールドに
ファイルを 保存 します。
Route_route2
の USA ブランチは以下のようになります。
ドイツの注文を処理する Otherwise ブランチの設定
キャンバスに Route_route2
が表示されている状態で、以下の操作を実施します。
-
Palette で Routing ドロワーを開き、Exposer パターン(
)を選択します。
キャンバスで
Choice_choice2
コンテナーをクリックします。Choice_choice2
コンテナーが展開され、Otherwise_otherwise1
ノードが追加されます。-
Otherwise_otherwise1
ノードを選択し、Properties ビューでそのプロパティーを開きます。 -
Properties ビューで、Id フィールドに
_else/ger
と入力します。 -
Palette で Transformation ドロワーを開き、Set Header パターン(
)を選択します。
キャンバスで
Otherwise_else/ger
ノードをクリックします。Otherwise_else/ger
コンテナーが展開され、SetHeader_setHeader3
ノードが追加されます。-
キャンバスで
SetHeader_setHeader3
ノードを選択し、Properties ビューでそのプロパティーを開きます。 Properties ビューで、以下を実行します。
- Expression ドロップダウンリストから constant を選択します。
-
2 番目の Expression フィールドに
Germany
と入力します。 - Trim はそのままにしておきます。
-
Header Name フィールドに
Destination
と入力します。 -
2 番目の Id フィールドに
_setHead_ger
と入力します。
-
Palette で Components ドロワーを開き 、Log パターン(
)を選択します。
キャンバスで
SetHeader_setHead_ger
ノードの下をクリックします。Otherwise_else/ger
コンテナーが展開され、Log_log3
ノードが追加されます。必要に応じて、Log_log3
ノードからSetHeader_setHead_ger
ノードにコネクターエラーをドラッグします。-
キャンバスで
Log_log3
ノードを選択し、Properties ビューでそのプロパティーを開きます。 Properties ビューで、以下を実行します。
-
Message フィールドに
Valid order - ship animals to Germany customer
と入力します。 -
Id フィールドに
_ger
と入力します。 - Logging Level はそのままにします。
-
Message フィールドに
Components コーダーで File パターン(
)を選択し、
Log_ger
ノードの下にクリックします。Otherwise_else/ger
コンテナーが展開され、To_to1
ノードが追加されます。必要に応じて、SetHeader_setHead_ger
ノードからTo_to1
ノードにコネクターエラーをドラッグします。-
キャンバスで
To_to1
ノードを選択し、Properties ビューでそのプロパティーを開きます。 Properties ビューで、以下を実行します。
-
Uri フィールドで、
directoryName
をtarget/messages/validOrders/Germany
に置き換えます。 -
Id フィールドに
_GER
と入力します。
-
Uri フィールドで、
- ファイルを 保存 します。
Route_route2
のドイツブランチは以下のようになります。

2 番目のルートの確認
キャンバスのルートは以下のようになります。
設定の完了した route1

設定の完了した route2

キャンバスの下部の 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() > 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
プロジェクトの実行に失敗する可能性があります。
更新されたプロジェクトが予想通りに機能するようにするには、以下の手順に従います。
-
ZooOrderApp/Camel Contexts/blueprint.xml
をローカルの Camel コンテキスト (テストなし) として実行します。 コンソールの出力の最後を確認します。以下の行が表示されるはずです。
ターゲットの宛先フォルダーを確認し、ルートが適切に実行されたことを確認します。
-
Project Explorer で
ZooOrderApp
を右クリックし、Refresh を選択します。 target/messages/
フォルダーを展開します。message*.xml
ファイルが以下のように宛先フォルダー内で分散されるはずです。図6.1 Project Explorer でのターゲットメッセージの宛先
-
Project Explorer で
次のステップ
次のチュートリアル「7章ルーティングコンテキストのデバッグ」で、Fuse Tooling デバッガーの使用方法について説明しています。
第7章 ルーティングコンテキストのデバッグ
このチュートリアルでは、Camel デバッガーを使用して、ローカルで実行中のルーティングコンテキストについてのロジックエラーを見つける方法を説明します。
ゴール
このチュートリアルでは、以下のタスクを実行します。
- 2 つのルートの対象ノードにブレークポイントを設定する
- Debug パースペクティブでルート全体を確認し、メッセージ変数の値を調べる
- 再度ルート全体を確認し、メッセージ変数の値の変更しその効果を確認する
前提条件
このチュートリアルを開始するには、以下のいずれかによる ZooOrderApp プロジェクトが必要です。
「6章ルーティングコンテキストへの別のルートの追加」チュートリアルを完了する。
あるいは、
-
「2章環境の設定」チュートリアルを完了し、「リソースファイルについて」に記載されているように、プロジェクトの
blueprint.xml
ファイルを、提供されるblueprintContexts/blueprint3.xml
ファイルに置き換える。
ブレークポイントの設定
デバッガーでは、条件付きおよび無条件のブレークポイントの両方を設定できます。このチュートリアルでは、無条件のブレークポイントのみを設定します。デバッグセッション中に特定の条件が満たされたときに発生する条件付きブレークポイントの設定方法については、『Tooling User Guide』を参照してください。
無条件ブレークポイントを設定するには、以下を実行します。
-
必要に応じて、ルートエディターで
ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml
を開きます。 -
Project Explorer で
Camel Contexts
→src/main/resources/OSGI-INF/blueprint/blueprint.xml
を展開して、両方のルートエントリーを表示します。 -
Route_route1 エントリーをダブルクリックして、Design タブで
Route_route1
にフォーカスを切り替えます。 キャンバスで
Choice_choice1
ノードを選択し、そのアイコンをクリックして無条件ブレークポイントを設定します。
注記ルートのエディターでは、ノードの
アイコンまたはその
アイコンをクリックして、特定のブレークポイントを有効または無効にできます。キャンバスを右クリックし、Delete all breakpoints を選択して、設定したすべてのブレークポイントを削除できます。
以下の
Route_Route1
ノードに無条件ブレークポイントを設定します。-
Log_log1
-
SetHeader_setHeader1
-
To_Invalid
-
Log_log2
-
SetHeader_setHeader2
-
To_Fulfill
-
-
Project Explorer で
src/main/resources/OSGI-INF/blueprint
の下にあるRoute_route2
をダブルクリックし、キャンバスでRoute_route2
を開きます。 以下の
Route_Route2
ノードに無条件ブレークポイントを設定します。-
Choice_choice2
-
SetHeader_setHead_usa
-
Log_usa
-
To_US
-
SetHeader_setHead_ger
-
Log_ger
-
To_GER
-
ルーティングコンテキスト全体の確認
ルーティングコンテキスト全体の確認を 2 つの方法で行うことができます。
-
step over(
): ブレークポイントに関係なく、ルーティングコンテキストで実行の次のノードに転送します。
resume(
): ルーティングコンテキストの次のアクティブなブレークポイントに対応します。
-
Project Explorer で
ZooOrderApp
プロジェクトのCamel Contexts
フォルダーを展開し、blueprint.xml
ファイルを表示します。 blueprint.xml
ファイルを右クリックしてコンテキストメニューを開き、Debug As → Local Camel Context (without tests) をクリックします。Camel デバッガーは、最初に発生したブレークポイントで実行を一時停止し、今 Debug パースペクティブを開くかどうかを尋ねます。
Yes をクリックします。
注記No をクリックすると、確認ペインが複数回表示されます。3 回拒否するとペインは消え、Camel デバッガーは実行を再開します。この時点でデバッガーと対話するには、Window → Open Perspective → > Debug をクリックして Debug パースペクティブを開く必要があります。
Debug ビューに示されるように、ルーティングコンテキストが
_choice1 in _route1 [blueprint.xml]
で一時停止された状態で Debug パースペクティブが開きます。注記ブレークポイントは、デバッガーが自動的に再開する前に最大 5 分間保持され、次のブレークポイントまたはルーティングコンテキストの最後のいずれかに移動します。
Variables ビューでノードを展開し、各ノードで利用可能な変数および値を表示します。
ルーティングコンテキスト全体を確認する際、最後のブレークポイントから値が変更された変数は黄色で強調表示されます。各ブレークポイントでノードを拡張して、変更された変数を表示する必要がある場合があります。
to step to the next breakpoint,
_log2 in _route1 [blueprint.xml]
をクリックします。-
Variables ビューのノードを展開して、
_choice1 in Route1 [blueprintxt.xml]
の最後のブレークポイントから変更した変数を確認します。 をクリックして、次のブレークポイント
_setHeader2 in Route1 [blueprint.xml]
をステップします。_log2 in Route1 [blueprint.xml]
のブレークポイントから、変更した変数を確認します(yellow で強調表示されています)。Debug ビューで
_log2 in _route1 [blueprint.xml]
をクリックし、簡単に比較するために Variables ビューに、ブレークポイント_log2 in _route1 [blueprint.xml]
からの変数の値を設定します。Debug ビューでは、同じメッセージフロー内のブレークポイント間を切り替えて、Variables ビュー内の変数の値をすばやく比較して監視することができます。
注記メッセージフローの長さは異なる可能性があります。
Route_route1
のInvalidOrders
ブランチを移動するメッセージの場合、メッセージフローは短くなります。Route_route2
に続行するRoute_route1
のValidOrders
ブランチを移動するメッセージでは、メッセージフローが長くなります。ルーティングコンテキスト全体の確認を続けます。1 つのメッセージがルーティングコンテキストを完了し、次のメッセージがそのコンテキストに入ると、Debug ビューに新しいメッセージフローが表示され、新しいブレッドクラム ID に関連付けられます。
この場合、
ID-janemurpheysmbp-home-55846-1471374645179-0-3
は、ルーティングコンテキストに入ったmessage2.xml
に対応する 2 番目のメッセージフローを識別します。ブレッドクラム ID は 2 つ増えます。注記メッセージがルーティングコンテキストを通過しても、エクスチェンジとメッセージ ID は同じまま変更されません。これらの ID は、メッセージフローのブレッドクラム ID から構築され、1 つずつ増加します。そのため、
message2.xml
の場合、そのExchangeId
およびMessageId
はID-janemurpheysmbp-home-55846-1471374645179-0-4
になります。message3.xml
がブレークポイント_choice1 in _route_route1 [blueprint.xml]
に入ると、Processor 変数を確認します。表示される値は、これまでルーティングコンテキストを移動したmessage1.xml
およびmessage2.xml
の累積メトリクスです。タイミングのメトリクスはミリ秒単位です。
-
ルーティングコンテキスト全体で各メッセージの確認を続行し、各処理ステップで変数とコンソールの出力を調べます。
message6.xml
がブレークポイントTo_GER in Route2 [blueprint.xml]
に入ると、デバッガーはブレッドスレッドをシャットダウンします。 メニューバーで
をクリックし、Camel デバッガーを終了します。コンソールは終了しますが、出力を手動で消去する必要があります。
注記Debug ビューで Camel Context ノードでスレッドまたはエンドポイントを選択した場合は、
を 2 回クリックし、まずスレッドまたはエンドポイントと 2 番目を終了して Camel Context を終了します。
メニューバーで、
を右クリックしてコンテキストメニューを開き、Close を選択して Debug パースペクティブを閉じます。
CodeReady Studio は、Camel デバッガーを起動したパースペクティブに自動的に戻ります。
Project Explorer でプロジェクトを右クリックし、Refresh を選択して表示を更新します。
注記すべてのメッセージがルーティングコンテキストを移動する前にセッションを途中で終了した場合、
ZooOrderApp/src/data
フォルダーにmessage3.xml.camelLock
のようなメッセージが表示されることがあります。プロジェクト上でデバッガーを再度実行する前に、これを削除する必要があります。これを行うには、.camelLock
メッセージをダブルクリックしてコンテキストメニューを開き、Delete を選択します。確認を受けたら、OK をクリックして削除を確定します。ZooOrderApp/target/messages/
ディレクトリーを展開して、メッセージが予想される宛先に配信されていることを確認します。
-
Project Explorer で
すべてのブレークポイントが設定され有効になっている状態で、ルーティングコンテキストをそのままにしておきます。
変数の値の変更
このセクションでは、メッセージがルーティングコンテキストを通過する際に変数の値がどのように変更されるかを簡単に確認するために、ウォッチリストに変数を追加します。メッセージの本文にある変数の値を変更して、その変更がルーティングコンテキストを介したメッセージのルートにどのような影響を与えるかを確認します。
-
ZooOrderApp
プロジェクトで Camel デバッガーを再度実行するには、blueprint.xml
ファイルを右クリックして、Debug As → Local Camel Context (without tests) をクリックします。 最初のブレークポイント
_choice1 in _route1 [blueprint.xml]
で停止したmessage1
の場合、変数NodeId
およびRouteId
(Exchange
カテゴリー内) ならびにMessageBody
およびCamelFileName
(Message
カテゴリー内) をウォッチリストに追加します。4 つの変数それぞれについて、以下を実行します。
- Variables ビューで、適切なカテゴリーを展開してターゲット変数を表示します。
変数 (ここでは
Exchange
カテゴリーのNodeId
) を右クリックしてコンテキストメニューを開き、Watch を選択します。Expressions タブが開き、監視するために選択した変数が一覧表示されます。
注記ウォッチリストを作成すると、対象の複数変数の現在値を迅速に確認するのが楽になります。
-
ステップ
message1
は、4 番目のブレークポイント_Fulfill in _route1 [blueprint.xml]
に到達するまで、ルーティングコンテキストを通じます。 -
Variables ビューで、
Message
カテゴリーを展開します。 変数
Destination
を監視リストに追加します。Expressions ビューに以下の変数が含まれているはずです。
注記- 変数リストの下にあるペインには、選択した変数の値が表示されます。
- Expressions ビューは、明示的に削除されるまで、リストに追加する変数をすべて保持します。
-
残りのルーティングコンテキスト全体で
message1
を確認し、次にルーティングコンテキスト全体でmessage2
を確認します。 -
_choice1 in _route1 [blueprint.xml]
でmessage3
を停止します。 -
Variables ビューで
Message
カテゴリーを展開し、MessageBody
変数を表示します。 MessageBody
を右クリックしてコンテキストメニューを開き、Change Value を選択します。(これを無効な注文から有効な注文に変更するため)、
quantity
の値を 15 から 10 に変更します。この操作により、インメモリーの値のみが変更されます (
message3.xml
ファイルは編集されません)。- OK をクリックします。
Expressions ビューに切り替え、
MessageBody
変数を選択します。変数リストの下にあるペインには
message3
のボディー全体が表示され、注文アイテムの現在の値を簡単に確認することができます。をクリックして、次のブレークポイントをステップします。
To_Invalid
につながるブランチに従う代わりに、message3
がTo_Fulfill
およびRoute_route2
につながるブランチに従うようになりました。
Camel デバッガーのフォーカスの絞り込み
ブレークポイントを無効化して再有効化することで、デバッガーのフォーカスを一時的に絞り込み、再び拡大できます。
-
ルーティングコンテキスト全体で
message4
を確認し、各ステップで Debug ビュー、Variables ビュー、および Console の出力をチェックします。 -
_choice1 in _route1 [blueprint.xml]
でmessage4
を停止します。 Breakpoints ビューに切り替え、
_choice1
の下に一覧表示されるブレークポイントの横にある各チェックボックスのチェックを外します。ブレークポイントのチェックボックスをクリアすると、一時的に無効になります。をクリックして、次のブレークポイントをステップします。
デバッガーは、無効なブレークポイントをスキップし、
_FulFill in _route1 [blueprint.xml]
に移動します。を再度クリックして次のブレークポイントをステップします。
デバッガーは
_GER in _route2 [blueprint.xml]
へジャンプします。-
ルーティングコンテキストで
を繰り返しステップ
message5
とmessage6
を迅速にクリックします。 - Breakpoints ビューに切り替え、すべてのブレークポイントの横にあるボックスにチェックマークを入れて、再度有効にします。
メッセージ変数値変更の影響の確認
デバッガーを停止し、message1 の数量変数の値を変更した結果を確認するには、以下の手順を実施します。
ツールバーで
をクリックし、Camel デバッガーを終了します。
-
コンソールの
ボタンをクリックして出力を削除します。
- Debug パースペクティブを閉じ、Camel デバッガーを起動したパースペクティブに戻ります。
- Project Explorer で表示を更新します。
ZooOrderApp/target/messages/
ディレクトリーを展開して、メッセージが想定どおりに配信されたかどうかを確認します。message1
のみがinvalidOrders
に送信され、message3.xml
がvalidOrders/Germany
フォルダーに表示されていることが確認できるはずです。
次のステップ
「8章ルートを通じたメッセージのトレース」チュートリアルで、ルーティングコンテキストを通じてメッセージを追跡し、ルーティングコンテキストのパフォーマンスを最適化および微調整できる場所を決定します。
第8章 ルートを通じたメッセージのトレース
トレースを使用すると、メッセージがあるノードから別のノードにルーティングされる時に、メッセージをインターセプトできます。ルーティングコンテキストを通じてメッセージを追跡し、ルーティングコンテキストのパフォーマンスを最適化および微調整できる場所を把握することができます。このチュートリアルでは、ルートを通じてメッセージを追跡する方法を説明します。
ゴール
このチュートリアルでは、以下のタスクを実行します。
-
Fuse Integration パースペクティブで
ZooOrderApp
を実行する -
ZooOrderApp
でトレースを有効にする -
ZooOrderApp
にメッセージをドロップし、すべてのルートノードを通じてメッセージを追跡する
前提条件
このチュートリアルを開始するには、以下のいずれかによる ZooOrderApp プロジェクトが必要です。
「6章ルーティングコンテキストへの別のルートの追加」チュートリアルを完了する。
あるいは、
-
「2章環境の設定」チュートリアルを完了し、「リソースファイルについて」に記載されているように、プロジェクトの
blueprint.xml
ファイルを、提供されるblueprintContexts/blueprint3.xml
ファイルに置き換える。
Fuse Integration パースペクティブの設定
メッセージのトレースを容易にするためにワークスペースを設定するには、以下を実行します。
ツールバーの右側にある
ボタンをクリックしてから、一覧から Fuse Integration を選択します。
デフォルトのレイアウトで Fuse Integration パースペクティブが開きます。
JMX Navigator タブを右端の Terminal タブにドラッグし、そこにドロップします。
この配置により、Diagram View がルーティングコンテキストのノードをグラフィカルに表示するスペースが多くなり、メッセージがルーティングコンテキストを移動する際にたどるパスを視覚的にトレースするのが容易になります。
注記ルーティングコンテキストの
.xml
ファイルへのアクセスを容易にするために (特にプロジェクトが複数のコンテキストで構成される場合)、このツールは Project Explorer のCamel Contexts
フォルダーにコンテキストを一覧表示します。また、ルーティングコンテキストのすべてのルートは、そのコンテキストファイルエントリーのすぐ下にアイコンとして表示されます。キャンバスにルーティングコンテキストの 1 つのルートを表示するには、Project Explorer でそのアイコンをダブルクリックします。ルーティングコンテキストのすべてのルートを表示するには、コンテキストファイルエントリーをダブルクリックします。
メッセージトレースの開始
ZooOrderApp
プロジェクトでメッセージのトレースを開始するには、以下を実行します。
-
Project Explorer で
ZooOrderApp
プロジェクトを展開し、src/main/resources/OSGI-INF/blueprint/blueprint.xml
を表示します。 -
src/main/resources/OSGI-INF/blueprint/blueprint.xml
を右クリックしてコンテキストメニューを開きます。 Run As → Local Camel Context (without tests) を選択します。
注記Local Camel Context を選択すると、
ZooOrderApp
プロジェクトの JUnit テストがまだ作成されていないため、ツールはテストのない実行に戻します。JUnit テストの作成は、後ほど「9章JUnit を使用したルートのテスト」で実行します。JMX Navigator で、
Local Processes
を展開します。-
maven [ID]
ノードを右クリックし、Connect を選択します。 ルートの要素を展開します。
Routes
ノードを右クリックし、Start Tracing を選択します。ツールは、Diagram View でルーティングコンテキストのグラフィカル表示を表示します。
すべてのメッセージフローパスを明確に表示するには、Diagram View タブで適切にフィットするようにノードをドラッグして、ノードを再配置する必要があります。また、Diagram View タブが拡張できるように、Red Hat CodeReady Studio の他のビューおよびタブのサイズを調整しなければならない場合もあります。
実行中の ZooOrderApp プロジェクトへのメッセージのドロップ
実行中の ZooOrderApp プロジェクトにメッセージをドロップするには、以下を行います。
Project Explorer で
ZooOrderApp/src/data
を展開し、メッセージファイル (message1.xml
からmessage6.xml
) にアクセスできるようにします。message1.xml
をドラッグし、JMX Navigator の_context1>Endpoints>file>src/data?noop=true
ノードにドロップします。メッセージがルートを移動するにつれ、ツールがトレースし、各ステップでの経過を記録します。
Messages View の設定
メッセージトレースを表示するには、Messages View をリフレッシュする必要があります。また、すべてのメッセージトレースで列を維持する場合には、Messages View の列を設定する必要もあります。
- Messages View を開きます。
-
パネルのメニューバーの右上にある
(更新ボタン)をクリックし、ビューに
message1.xml
のメッセージトレースを設定します。 パネルのメニューバーの
アイコンをクリックし、Configure Columns を選択して Configure Columns ウィザードを開きます。
注記ルーティングコンテキストでメッセージに設定するメッセージヘッダー (Destination) がリストに表示されることに注意してください。
項目を選択または選択解除して、Messages View に項目を追加または除外することができます。選択した個々の項目を強調表示し、リストで上下に移動することで、Messages View で項目が表示される列の順番を再編成できます。
Configure Columns ウィザードで、このように列を選択して順序付けします。
これらの列とその順序は、列を変更するまで Messages View で維持されます。
ツールのすべての表で列のレイアウトを制御できます。ドラッグメソッドを使用して、表のフォーマットを一時的に再配置します。たとえば、列の境界線ルールをドラッグして、その幅を拡大または縮小します。列を非表示にするには、その境界線を完全に縮小します。列ヘッダーをドラッグして、表内で列を移動させます。配置を維持したいときは、代わりに View → Configure Columns メソッドを使用する必要があります。
メッセージトレース全体の確認
メッセージトレース全体を確認するには、以下を行います。
-
message2.xml
をドラッグし、JMX Navigator の_context1>Endpoints>file>src/data?noop=true
ノードにドロップします。 - Console から Messages View に切り替えます。
Messages View で
(更新ボタン)をクリックし、ビューに
message2.xml
メッセージトレースを設定します。JMX Navigator にメッセージをドロップするたびに、Messages View を更新して、メッセージトレースを反映させる必要があります。
メッセージトレースのいずれかをクリックし、Properties ビューでその詳細を表示します。
ツールは、Properties ビューの上半分にメッセージトレースの詳細 (設定されている場合はメッセージヘッダーを含む) を表示し、Properties ビューの下半分にメッセージインスタンスの内容を表示します。そのため、アプリケーションがルート内の任意のステップでヘッダーを設定した場合、Message Details を確認して、想定通りに設定されたかどうかを確認することができます。
各インスタンスを強調表示し、特定のメッセージがどのようにルートを移動したかや、ルートの各ステップで期待したとおりに処理されたかどうかを調べて、メッセージインスタンス全体を確認することができます。
Diagram View を開いて、ルート内の関連付けられたステップが強調表示されていることを確認します。
ツールは、ルートを Diagram View に表示し、処理のステップを終了するパスをタイミングおよびパフォーマンスメトリクス (ミリ秒単位) にタグ付けします。ダイアグラムには、メトリクス Total exchanges だけが表示されます。
表示されるメトリクスにマウスポインターをかざして、メッセージフローに関する追加のメトリクスを表示します。
- メッセージ処理のステップにかかった平均時間
- メッセージ処理のステップにかかった最大時間
- メッセージ処理のステップにかかった最小時間
任意で、トレースが有効であれば、いつでも
ZooOrderApp/src/data/
の残りのメッセージを JMX Navigator の_context1>Endpoints>file>src/data?noop=true
ノードにドラッグし、ドロップすることができます。後続のドロップごとに、
(更新ボタン) をクリックし、新しいメッセージトレースでメッセージビューを設定するのを忘れないでください。
完了時には、以下を実行します。
-
JMX Navigator で
_context1
を右クリックし、Stop Tracing Context を選択します。 -
コンソールを開き、パネルの右上にある
ボタンをクリックして、コンソールを停止します。次に、
ボタンをクリックしてコンソールの出力を消去します。
-
JMX Navigator で
次のステップ
「9章JUnit を使用したルートのテスト」チュートリアルで、プロジェクトの JUnit テストケースを作成し、プロジェクトを Local Camel Context
として実行します。
第9章 JUnit を使用したルートのテスト
このチュートリアルでは、New Camel Test Case ウィザードを使用してルートのテストケースを作成し、ルートをテストする方法を説明します。
概要
New Camel Test Case ウィザードは、定形の JUnit テストケースを生成します。ルートを作成または変更する場合 (例: プロセッサーをさらに追加する場合)、テストケースを作成または生成されたテストケースを変更して、作成または更新したルートに固有の期待値およびアサーションを追加する必要があります。これにより、テストがルートに対して有効になります。
ゴール
このチュートリアルでは、以下のタスクを実行します。
-
JUnit テストケースを保存する
/src/test/
フォルダーを作成する -
ZooOrderApp
プロジェクトの JUnit テストケースを生成する - 新たに生成された JUnit テストケースを変更する
-
ZooOrderApp
プロジェクトのpom.xml
ファイルを変更する -
新しい JUnit テストケースで
ZooOrderApp
を実行する - 出力を確認する
前提条件
このチュートリアルを開始するには、以下のいずれかによる ZooOrderApp プロジェクトが必要です。
「8章ルートを通じたメッセージのトレース」チュートリアルを完了する。
あるいは、
-
「2章環境の設定」チュートリアルを完了し、「リソースファイルについて」に記載されているように、プロジェクトの
blueprint.xml
ファイルを、提供されるblueprintContexts/blueprint3.xml
ファイルに置き換える。
Project Explorer で、
ZooOrderApp
プロジェクトの/src/data/
ディレクトリーおよび/target/messages/
サブディレクトリーからトレースにより生成されたメッセージを削除します。トレースにより生成されたメッセージは、ID-
接頭辞で始まります。たとえば、図9.1「トレースにより生成されたメッセージ」には、8 つのトレースにより生成されたメッセージが表示されています。図9.1 トレースにより生成されたメッセージ
すべてのトレースにより生成されたメッセージをバッチで選択し、右クリックしてから Delete を選択します。
src/test
フォルダーの作成
ZooOrderApp
プロジェクトの JUnit テストケースを作成する前に、ビルドパスに含まれるフォルダーを作成する必要があります。
-
Project Explorer で
ZooOrderApp
プロジェクトを右クリックし、New → Folder を選択します。 New Folder ダイアログで、プロジェクトツリーペインで
ZooOrderApp
ノードを展開し、src
フォルダーを選択します。ZooOrderApp/src
が Enter or select the parent folder フィールドに表示されるのを確認してください。Folder name に
/test/java
を入力します。Finish をクリックします。
Project Explorer では、
src/main/resources
フォルダーの下に新しいsrc/test/java
フォルダーが表示されます。新しい
/src/test/java
フォルダーがビルドパスに含まれていることを確認します。-
Project Explorer で
/src/test/java
フォルダーを右クリックし、コンテキストメニューを開きます。 Build Path を選択してメニューオプションを表示します。
Remove from Build Path のメニューオプションで、
/src/test/java
フォルダーが現在ビルドパスに含まれていることが確認できます。
-
Project Explorer で
JUnit テストケースの作成
ZooOrderApp
プロジェクトの JUnit テストケースを作成するには、以下を実行します。
-
Project Explorer で
src/test/java
を選択します。 右クリックして New → Camel Test Case の順に選択します。
-
Camel JUnit Test Case ウィザードで、
Source folder
フィールドにZooOrderApp/src/test/java
が含まれていることを確認します。適切なフォルダーを見つけるには、をクリックします。
-
Package フィールドに、
tutorial.zooapp.route
を入力します。このパッケージが、新しいテストケースに含まれます。 test フィールド下の Camel XML ファイルで
をクリックし、XML ファイルをフィルタリングするように設定されたファイルエクスプローラーを開き、
ZooOrderApp
プロジェクトのblueprint.xml
ファイルを選択します。OK をクリックします。Name フィールドは、デフォルトで BlueprintXmlTest に設定されます。
Next をクリックして Test Endpoints ページを開きます。
デフォルトでは、すべてのエンドポイントが選択され、テストケースに含まれます。
Finish をクリックします。
注記プロンプトが表示されたら、JUnit をビルドパスに追加します。
テストのアーティファクトはプロジェクトに追加され、src/test/java
の下にある Project Explorer に表示されます。テストケースを実装するクラスは、ツールの Java エディターで開きます。
package tutorial.zooapp.route; import org.apache.camel.EndpointInject; import org.apache.camel.Produce; import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.blueprint.CamelBlueprintTestSupport; import org.junit.Test; public class BlueprintXmlTest extends CamelBlueprintTestSupport { // TODO Create test message bodies that work for the route(s) being tested // Expected message bodies protected Object[] expectedBodies = { "<something id='1'>expectedBody1</something>", "<something id='2'>expectedBody2</something>" }; // Templates to send to input endpoints @Produce(uri = "file:src/data?noop=true") protected ProducerTemplate inputEndpoint; @Produce(uri = "direct:OrderFulfillment") protected ProducerTemplate input2Endpoint; // Mock endpoints used to consume messages from the output endpoints and then perform assertions @EndpointInject(uri = "mock:output") protected MockEndpoint outputEndpoint; @EndpointInject(uri = "mock:output2") protected MockEndpoint output2Endpoint; @EndpointInject(uri = "mock:output3") protected MockEndpoint output3Endpoint; @EndpointInject(uri = "mock:output4") protected MockEndpoint output4Endpoint; @Test public void testCamelRoute() throws Exception { // Create routes from the output endpoints to our mock endpoints so we can assert expectations context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("file:target/messages/invalidOrders").to(outputEndpoint); from("file:target/messages/validOrders/USA").to(output3Endpoint); from("file:target/messages/validOrders/Germany").to(output4Endpoint); } }); // Define some expectations // TODO Ensure expectations make sense for the route(s) we're testing outputEndpoint.expectedBodiesReceivedInAnyOrder(expectedBodies); // Send some messages to input endpoints for (Object expectedBody : expectedBodies) { inputEndpoint.sendBody(expectedBody); } // Validate our expectations assertMockEndpointsSatisfied(); } @Override protected String getBlueprintDescriptor() { return "OSGI-INF/blueprint/blueprint.xml"; } }
この生成された JUnit テストケースは ZooOrderApp
プロジェクトには不十分なため、正常に実行できません。「BlueprintXmlTest ファイルの変更」および「pom.xml ファイルの変更」に記載されているように、テストケースおよびプロジェクトの pom.xml
を変更する必要があります。
BlueprintXmlTest ファイルの変更
BlueprintXmlTest.java
ファイルを以下のように変更する必要があります。
- 必要なファイル関数をサポートする複数のクラスをインポートする
-
さまざまなソース
.xml
ファイルの内容を保持する変数を作成する -
ソース
.xml
ファイルの内容を読み取る - 適切な期待値を定義する
以下の手順にしたがって BlueprintXmlTest.java
ファイルを変更します。
Project Explorer で
ZooOrderApp
プロジェクトを展開し、BlueprintXmlTest.java
ファイルを表示します。-
BlueprintXmlTest.java
ファイルを開きます。 -
Java エディターで、
import org.apache.camel.EndpointInject;
の横にある展開ボタンをクリックしてリストを展開します。 太字テキストの 2 行を追加します。最初の行を追加するとエラーが発生しますが、次のセクションで指示どおりに
pom.xml
ファイルを更新すると解決されます。package tutorial.zooapp.route; import org.apache.camel.EndpointInject; import org.apache.camel.Produce; import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.blueprint.CamelBlueprintTestSupport; import org.apache.commons.io.FileUtils; import org.junit.Test; import java.io.File;
-
// Expected message bodies
の後、直接従った行まで下方向にスクロールします。 これらの行の sisu-CallbackImpl
protected Object[] expectedBodies={ …… expectedBody2</something>"};
secretKeyRef-ClientAuth は、以下のprotected String body#;
行に置き換えます。protected String body1; protected String body2; protected String body3; protected String body4; protected String body5; protected String body6;
public void testCamelRoute() throws Exception {
行まで下方向にスクロールし、以下の行のbody# = FileUtils.readFileToString(new File("src/data/message#.xml"), "UTF-8");
行の後に直接挿入します。これらの行は、次のセクションで指示どおりにpom.xml
ファイルを更新するまでエラーを示します。// Valid orders body2 = FileUtils.readFileToString(new File("src/data/message2.xml"), "UTF-8"); body4 = FileUtils.readFileToString(new File("src/data/message4.xml"), "UTF-8"); body5 = FileUtils.readFileToString(new File("src/data/message5.xml"), "UTF-8"); body6 = FileUtils.readFileToString(new File("src/data/message6.xml"), "UTF-8"); // Invalid orders body1 = FileUtils.readFileToString(new File("src/data/message1.xml"), "UTF-8"); body3 = FileUtils.readFileToString(new File("src/data/message3.xml"), "UTF-8");
-
// TODO Ensure expectations make sense for the route(s) we’re testing
の後、直接従った行まで下方向にスクロールします。 outputEndpoint.expectedBodiesReceivedInAnyOrder(expectedBodies);
で始まり、...inputEndpoint.sendBody(expectedBody); }
で終わるコードのブロックを、ここに示す行に置き換えます。// Invalid orders outputEndpoint.expectedBodiesReceived(body1, body3); // Valid orders for USA output3Endpoint.expectedBodiesReceived(body2, body5, body6); // Valid order for Germany output4Endpoint.expectedBodiesReceived(body4);
残りのコードはそのまま残します。
- ファイルを保存します。
更新された
BlueprintXmlTest.java
ファイルに必要な変更が反映されていることを確認します。以下のようになるはずです。package tutorial.zooapp.route; import org.apache.camel.EndpointInject; import org.apache.camel.Produce; import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.blueprint.CamelBlueprintTestSupport; import org.apache.commons.io.FileUtils; import org.junit.Test; import java.io.file; public class BlueprintXmlTest extends CamelBlueprintTestSupport { // TODO Create test message bodies that work for the route(s) being tested // Expected message bodies protected String body1; protected String body2; protected String body3; protected String body4; protected String body5; protected String body6; // Templates to send to input endpoints @Produce(uri = "file:src/data?noop=true") protected ProducerTemplate inputEndpoint; @Produce(uri = "direct:OrderFulfillment") protected ProducerTemplate input2Endpoint; // Mock endpoints used to consume messages from the output endpoints and then perform assertions @EndpointInject(uri = "mock:output") protected MockEndpoint outputEndpoint; @EndpointInject(uri = "mock:output2") protected MockEndpoint output2Endpoint; @EndpointInject(uri = "mock:output3") protected MockEndpoint output3Endpoint; @EndpointInject(uri = "mock:output4") protected MockEndpoint output4Endpoint; @Test public void testCamelRoute() throws Exception { // Create routes from the output endpoints to our mock endpoints so we can assert expectations context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { // Valid orders body2 = FileUtils.readFileToString(new File("src/data/message2.xml"), "UTF-8"); body4 = FileUtils.readFileToString(new File("src/data/message4.xml"), "UTF-8"); body5 = FileUtils.readFileToString(new File("src/data/message5.xml"), "UTF-8"); body6 = FileUtils.readFileToString(new File("src/data/message6.xml"), "UTF-8"); // Invalid orders body1 = FileUtils.readFileToString(new File("src/data/message1.xml"), "UTF-8"); body3 = FileUtils.readFileToString(new File("src/data/message3.xml"), "UTF-8"); from("file:target/messages/invalidOrders").to(outputEndpoint); from("file:target/messages/validOrders/USA").to(output3Endpoint); from("file:target/messages/validOrders/Germany").to(output4Endpoint); from("direct:OrderFulfillment").to(output2Endpoint); } }); // Define some expectations // TODO Ensure expectations make sense for the route(s) we're testing // Invalid orders outputEndpoint.expectedBodiesReceived(body1, body3); // Valid orders for USA output3Endpoint.expectedBodiesReceived(body2, body5, body6); // Valid order for Germany output4Endpoint.expectedBodiesReceived(body4); // Validate our expectations assertMockEndpointsSatisfied(); } @Override protected String getBlueprintDescriptor() { return "OSGI-INF/blueprint/blueprint.xml"; } }
pom.xml ファイルの変更
commons-io
プロジェクトの依存関係を ZooOrderApp プロジェクトの pom.xml
ファイルに追加する必要があります。
-
Project Explorer で、
target
フォルダーの下のpom.xml
を選択し、ツールの XML エディターで開きます。 -
ページの下部にある
pom.xml
タブをクリックして、ファイルを表示して編集します。 <dependencies>
セクションの最後に以下の行を追加します。<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> <scope>test</scope> </dependency>
- ファイルを保存します。
JUnit テストの実行
テストを実行するには、以下を実行します。
- JBoss パースペクティブに切り替え、より多くのワークスペースを確保します。
-
Project Explorer で
ZooOrderApp
プロジェクトを右クリックします。 Run As → JUnit Test を選択します。
デフォルトでは、JUnit ビューがサイドバーで開きます (より見易くするには、Console、Servers、および Properties タブが表示される右下のパネルにドラッグします)。
注記プロジェクトで JUnit を始めて実行する際に、テストに失敗する場合があります。テストを再実行すると、正常な結果が得られます。
テストが正常に実行されると、以下のような結果が表示されます。
図9.2 正常な JUnit の実行
テストに失敗すると、以下のような結果が表示されます。
図9.3 失敗した JUnit の実行
注記実行環境が Java SE 8 に設定されていない場合、JUnit は失敗します。JUnit タブの上部にあるメッセージバーは、正しい SDK を検出できないことを示すエラーメッセージを表示します。
この問題を解決するには、プロジェクトのコンテキストメニューを開き、Run As → Run Configurations → JRE の順に選択します。Execution environment フィールドの横にある Environments ボタンをクリックして、Java SE 8 環境を見つけて選択します。
出力を確認し、テストの失敗を解決するアクションを実行します。
JUnit パネルに表示されるエラーの詳細を表示するには、パネルのメニューバーの
をクリックして、ビューを最大化します。
JUnit テストケースを再度実行する前に、Project Explorer で ZooOrderApp プロジェクトの
/src/data
フォルダーから JUnit が生成するテストメッセージを削除します (図9.1「トレースにより生成されたメッセージ」を参照)。
関連資料
JUnit テストの詳細は、JUnit を参照してください。
次のステップ
「10章Red Hat Fuse へのプロジェクトのパブリッシュ」チュートリアルで、Apache Camel プロジェクトを Red Hat Fuse に公開する方法を説明します。
第10章 Red Hat Fuse へのプロジェクトのパブリッシュ
このチュートリアルでは、プロジェクトを Red Hat Fuse にパブリッシュするプロセスについて順を追って説明します。Red Hat Fuse Tooling を実行しているマシンと同じマシンに Red Hat Fuse のインスタンスがインストールされていることを前提とします。
ゴール
このチュートリアルでは、以下のタスクを実行します。
- Red Hat Fuse サーバーを定義する
- パブリッシュオプションを設定する
-
Red Hat Fuse サーバーを起動し、
ZooOrderApp
プロジェクトをパブリッシュする - Red Hat Fuse サーバーに接続する
-
ZooOrderApp
プロジェクトのバンドルが正常にビルドされ、公開されたかどうかを確認する -
ZooOrderApp
プロジェクトをアンインストールする
前提条件
このチュートリアルを開始するには、以下の項目が必要です。
- Red Hat Fuse インスタンスへのアクセス権限
- お使いのコンピューターに Java 8 がインストールされていること
以下のいずれかによる ZooOrderApp プロジェクト
「9章JUnit を使用したルートのテスト」チュートリアルを完了する。
あるいは、
-
「2章環境の設定」チュートリアルを完了し、「リソースファイルについて」に記載されているように、プロジェクトの
blueprint.xml
ファイルを、提供されるblueprintContexts/blueprint3.xml
ファイルに置き換える。
Red Hat Fuse サーバーの定義
サーバーを定義するには、以下を実行します。
- Fuse Integration パースペクティブを開きます。
- パネル右下の Servers タブをクリックして、Servers ビューを開きます。
No servers are available. このリンクをクリックして新規の server… リンクをクリックして、Define a New Server ページを開きます。
注記サーバーがすでに定義されているときに新しいサーバーを定義するには、Servers ビュー内で右クリックして New → Server を選択します。
Red Hat JBoss Middleware ノードを展開して、利用可能なサーバーオプションを表示します。
- Red Hat Fuse サーバーを選択します。
Server’s host name および Server name のデフォルト値 (それぞれ localhost および Fuse n.n Runtime Server) を受け入れ、Next をクリックして Runtime ページを開きます。
注記Fuse がインストールされていない場合は、Download and install runtime リンクを使用して今すぐダウンロードできます。
サーバーがすでに定義されている場合、ツールはこのページをスキップし、代わりに設定の詳細ページを表示します。
- Name にはデフォルトを受け入れます。
- Home Directory フィールドの横にある Browse をクリックして、インストールに移動し、選択します。
Execution Environment の横にあるドロップダウンメニューからランタイム JRE を選択します。
JavaSE-1.8 (推奨) を選択します。必要に応じて、Environments ボタンをクリックしてリストから選択します。
注記Fuse サーバーには Java 8 (推奨) が必要です。Execution Environment にこれを選択するには、事前にインストールしておく必要があります。
- Alternate JRE オプションはそのままにしておきます。
Next をクリックして Fuse Server のランタイム定義を保存し、Fuse server configuration details ページを開きます。
SSH Port のデフォルト (8101) を受け入れます。
ランタイムは SSH ポートを使用して、サーバーの Karaf シェルに接続します。このデフォルトが正しくない場合は、Red Hat Fuse
installDir/etc/org.apache.karaf.shell.cfg
ファイルを確認して正しいポート番号を検出できます。User Name に、サーバーへのログインに使用される名前を入力します。
これは、Red Hat Fuse installDir/etc/users.properties ファイルに保存されているユーザー名です。
注記/etc/users.properties
ファイルのデフォルトのユーザーがアクティベートされている場合 (アンコメント)、ツールは User Name および Password にデフォルトユーザーの名前およびパスワードを自動入力します。設定されていない場合は、
user=password,role
のフォーマットを使用してそのファイルにユーザーを追加するか (例:joe=secret,Administrator
)、karafjaas
コマンドセットを使用して設定できます。-
jaas:realms
: レルムを一覧表示します。 -
jaas:manage --index 1
: 最初の (サーバー) レルムを編集します。 -
jaas:useradd <username> <password>
-urefireto は、ユーザーと関連付けられたパスワードを追加します。 -
jaas:roleadd <username> Administrator
: 新規ユーザーのロールを指定します。 jaas:update
: 新しいユーザー情報を使用してレルムを更新します。サーバーに対して jaas レルムがすでに選択されている場合は、コマンド
JBossFuse:karaf@root>
jaas:users
を実行してユーザー名を検出できます。
-
Password に、User name がサーバーにログインするのに必要なパスワードを入力します。
これは、Red Hat Fuse の
installDir/etc/users.properties
ファイルまたは karafjaas
コマンドによって設定されたパスワードです。Finish をクリックします。
Runtime Server [stopped, Synchronized] が Servers ビューに表示されます。
Servers ビューで Runtime Server を展開します。
jmx[Disconnected] が、Runtime Server [stopped, synced] エントリーの下にノードとして表示されます。
パブリッシュオプションの設定
パブリッシュオプションを使用して、ZooOrderApp
プロジェクトを稼働中のサーバーにパブリッシュする方法およびタイミングを設定できます。
- プロジェクトに加えた変更を保存したら直ちに自動的に
- プロジェクトを変更して保存した後に設定した間隔で自動的に
- パブリッシュ操作を選択する際に手動で
このチュートリアルでは、ZooOrderApp
プロジェクトへの変更を保存したら直ちにパブリッシュするように設定します。そのためには、以下の手順を実施します。
- Servers ビューで Runtime Server [stopped, Synchronized] エントリーをダブルクリックして、その概要を表示します。
サーバーの Overview ページで Publishing セクションを展開し、オプションを表示します。
オプション Automatically publish when resources change を必ず有効にしてください。
必要に応じて、Publishing interval の値を変更して、変更されたプロジェクトのパブリッシュをスピードアップまたは遅延させます。
-
Servers ビューで
をクリックします。
サーバーが起動するまで数秒待機します。起動すると以下のようになります。
Terminal ビューには、以下のスプラッシュ画面が表示されます。
Servers ビューは以下を表示します。
JMX Navigator には n.n Runtime Server[Disconnected が表示されます。
Servers ビューで n.n Runtime Server [Started] を右クリックし、Add and Remove を選択して Add and Remove ページを開きます。
オプション If server is started, publish changes immediately のチェックを選択するようにしてください。
ZooOrderApp
を選択し、Add をクリックして Fuse サーバーに割り当てます。Finish をクリックします。
Servers ビューには以下が表示されるはずです。
Runtime Server [Started, Synchronized]
注記サーバーの synchronized は、サーバーでパブリッシュされているすべてのモジュールがローカルのカウンターパートと同じであることを意味します。
ZooOrderApp [Started, Synchronized]
注記モジュールの synchronized は、パブリッシュされているモジュールがローカルのカウンターパートと同じであることを意味します。自動パブリッシュが有効になっているため、ZooOrderApp プロジェクトに加えられた変更は直ちにパブリッシュされます (Publishing interval の値に従います)。
- JMX[Disconnected]
ランタイムサーバーへの接続
ランタイムサーバーへの接続後、ZooOrderApp
プロジェクトのパブリッシュされた要素が表示され、それらと対話できます。
- Servers ビューで JMX[Disconnected] をダブルクリックし、ランタイムサーバーに接続します。
JMX Navigator で
Camel
フォルダーを展開し、ZooOrderApp
の要素を表示します。Bundles ノードをクリックし、Properties ビューに、ランタイムサーバーにインストールされているバンドルのリストを反映させます。
Search フィールドで ZooOrderApp を入力します。対応するバンドルが表示されます。
注記または、Terminal ビューで
osgi:list
コマンドを実行し、サーバーランタイムにインストールされているバンドルに関する生成されたリストを表示することもできます。ツールは、osgi:list
コマンドが表示する OSGi バンドルに異なる命名スキームを使用します。この場合、コマンドはCamel Blueprint Quickstart
を返します。これはインストールされたバンドルのリストの最後に表示されるプロジェクトの
pom.xml
ファイルの<build>
セクションで、バンドルのシンボリック名およびそのバンドル名 (OSGi) がmaven-bundle-plugin
エントリーに一覧表示されます。
ZooOrderApp プロジェクトのアンインストール
パブリッシュ済みリソースをアンインストールのに、JMX 接続を切断したり、サーバーを停止する必要はありません。
ランタイムサーバーから ZooOrderApp
リソースを削除するには、以下を実行します。
- Servers ビューで n.n Runtime Server を右クリックし、コンテキストメニューを開きます。
Add and Remove を選択します。
-
Configured 列で
ZooOrderApp
を選択し、Remove をクリックしてZooOrderApp
リソースを Available 列に移動します。 - Finish をクリックします。
Servers ビューで JMX[Connected] を右クリックし、Refresh をクリックします。
JMX[Connected] 下の
Camel
ツリーが消えます。注記JMX Navigator でも、Server Connections > n.n Runtime Server[Connected] の
Camel
ツリーが消失します。- Properties ビューに表示される Bundles ページで、一覧の最後までスクロールし、ZooOrderApp のバンドルが一覧表示されていないことを確認します。