11.5. Message Dispatcher

概要

図11.4「Message Dispatcher パターン」 に示される Message Dispatcher パターンは、チャネルからメッセージを消費し、それらをメッセージ処理を担当する パフォーマー にローカルに配信するために使用されます。Apache Camel アプリケーションでは通常、パフォーマーはプロセス内エンドポイントで表されます。これらのエンドポイントは、メッセージをルートの別のセクションに転送するために使用されます。

図11.4 Message Dispatcher パターン

Message Dispatcher パターン

Apache Camel で Message Dispatcher パターンを実装するには、以下の方法があります。

JMS セレクター

アプリケーションが JMS キューからメッセージを消費する場合は、JMS セレクター を使用して Message Dispatcher パターンを実装できます。JMS セレクターは、JMS ヘッダーと JMS プロパティーに対する述語の式です。セレクターが true に評価されると JMS メッセージはコンシューマーに到達でき、セレクターが false に評価されると JMS メッセージはブロックされます。多くの点で JMS セレクターは 「Message Filter」 に似ていますが、そのフィルタリングが JMS プロバイダーの中で実装されているという追加の利点があります。これは、JMS セレクターがメッセージを Apache Camel アプリケーションに送信される前にブロックできることを意味します。これにより、効率を大幅に向上させることができます。

Apache Camel では、JMS エンドポイント URI で selector クエリーオプションを設定することで、コンシューマーエンドポイントに JMS セレクターを定義できます。以下に例を示します。

from("jms:dispatcher?selector=CountryCode='US'").to("cxf:bean:replica01");
from("jms:dispatcher?selector=CountryCode='IE'").to("cxf:bean:replica02");
from("jms:dispatcher?selector=CountryCode='DE'").to("cxf:bean:replica03");

セレクター文字列の述語は、SQL92 条件式構文のサブセットに基づきます (完全な詳細は JMS 仕様 を参照してください) 。セレクター文字列の識別子は、JMS ヘッダーまたは JMS プロパティーのいずれかを参照できます。たとえば、前述のルートでは、送信側は CountryCode という JMS プロパティーを設定しています。

Apache Camel アプリケーション内からメッセージに JMS プロパティーを追加する場合は、メッセージヘッダー (In メッセージまたは Out メッセージのいずれかに対して) を設定することで実現できます。JMS エンドポイントへの読み取りまたは書き込み時に、Apache Camel は JMS ヘッダーおよび JMS プロパティーとネイティブメッセージのヘッダーとの間のマッピングを行います。

技術的には、セレクター文字列は application/x-www-form-urlencoded MIME 形式に従い、URL エンコードされている必要があります (HTML 仕様 を参照)。実際には、& (アンパサンド) 文字は URI の各クエリーオプションを区切るために使用されるので、問題が発生する可能性があります。& 文字を埋め込む必要があるような複雑なセレクター文字列については、java.net.URLEncoder ユーティリティークラスを使用して文字列をエンコードできます。以下に例を示します。

from("jms:dispatcher?selector=" + java.net.URLEncoder.encode("CountryCode='US'","UTF-8")).
    to("cxf:bean:replica01");

ここでは UTF-8 エンコーディングを使用する必要があります。

ActiveMQ の JMS セレクター

ActiveMQ エンドポイントで JMS セレクターを定義することもできます。以下に例を示します。

from("activemq:dispatcher?selector=CountryCode='US'").to("cxf:bean:replica01");
from("activemq:dispatcher?selector=CountryCode='IE'").to("cxf:bean:replica02");
from("activemq:dispatcher?selector=CountryCode='DE'").to("cxf:bean:replica03");

詳細は、ActiveMQ: JMS Selectors および ActiveMQ Message Properties を参照してください。

コンテンツベースルーター

Content-Based Router パターンと Message Dispatcher パターンの基本的な違いは、コンテンツベースルーターがメッセージを物理的に別々の宛先 (リモートのエンドポイント) にディスパッチするのに対し、メッセージディスパッチャーは同じプロセス空間内でローカルにメッセージをディスパッチする点です。Apache Camel では、これらの 2 つのパターンの違いは、ターゲットエンドポイントによって決定されます。コンテンツベースルーターとメッセージディスパッチャーのどちらも、同じルーターロジックを使用して実装されます。ターゲットエンドポイントがリモートの場合、そのルートはコンテンツベースルーターを定義します。ターゲットエンドポイントがプロセス内にある場合、そのルートはメッセージディスパッチャーを定義します。

Content-Based Router パターンの使用方法の詳細および例については、「Content-Based Router」 を参照してください。