11.6. Selective Consumer
概要
図11.5「Selective Consumer パターン」 に記載されている Selective Consumer パターンは、受信メッセージにフィルターを適用することで、特定の選択基準を満たしたメッセージのみが処理されるようにするコンシューマーを示します。
図11.5 Selective Consumer パターン
Apache Camel に Selective Consumer パターンを実装するには、以下の方法があります。
JMS セレクター
JMS セレクターは、JMS ヘッダーと JMS プロパティーに対する述語の式です。セレクターが true
に評価されると JMS メッセージはコンシューマーに到達でき、セレクターが false
に評価されると JMS メッセージはブロックされます。たとえば、キュー selective
からメッセージを消費し、国コードプロパティーが US
に等しいメッセージのみを選択するには、以下の Java DSL ルートを使用できます。
from("jms:selective?selector=" + java.net.URLEncoder.encode("CountryCode='US'","UTF-8")). to("cxf:bean:replica01");
セレクター文字列 CountryCode='US'
は、クエリーオプションの解析で問題が発生しないように、URL エンコード (UTF-8 文字を使用) されている必要があります。この例では、JMS プロパティー CountryCode
が送信者によって設定されていることを前提としています。JMS セレクターの詳細は、「JMS セレクター」 を参照してください。
セレクターが JMS キューに適用されると、選択されなかったメッセージはキュー上に残り、同じキューに割り当てられた他のコンシューマーがある場合はそちらから利用できることになります。
ActiveMQ の JMS セレクター
ActiveMQ エンドポイントで JMS セレクターを定義することもできます。以下に例を示します。
from("acivemq:selective?selector=" + java.net.URLEncoder.encode("CountryCode='US'","UTF-8")). to("cxf:bean:replica01");
詳細は、ActiveMQ: JMS Selectors および ActiveMQ Message Properties を参照してください。
メッセージフィルター
コンシューマーエンドポイントがセレクターをサポートしていない場合は、代わりにフィルタープロセッサーをルートに挿入することで対応できます。たとえば、以下のように、Java DSL を使用して、US 国コードが設定されたメッセージのみを処理する選択的コンシューマーを定義できます。
from("seda:a").filter(header("CountryCode").isEqualTo("US")).process(myProcessor);
以下のように、XML の設定を使用して同じルートを定義できます。
<camelContext id="buildCustomProcessorWithFilter" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="seda:a"/> <filter> <xpath>$CountryCode = 'US'</xpath> <process ref="#myProcessor"/> </filter> </route> </camelContext>
Apache Camel のフィルタープロセッサーの詳細は、「Message Filter」 を参照してください。
メッセージフィルターを使用して JMS キュー からメッセージを選択する場合には、注意が必要です。フィルタープロセッサーを使用する場合、ブロックされたメッセージは単に破棄されます。したがって、メッセージがキューから消費される場合 (キューでは各メッセージは 1 回のみ消費可能、「Competing Consumers」 を参照 )、ブロックされたメッセージはまったく処理されないことになります。これは望ましい動作ではない可能性があります。