11.6. Selective Consumer

概要

図11.5「Selective Consumer パターン」 に記載されている Selective Consumer パターンは、受信メッセージにフィルターを適用することで、特定の選択基準を満たしたメッセージのみが処理されるようにするコンシューマーを示します。

図11.5 Selective Consumer パターン

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」 を参照 )、ブロックされたメッセージはまったく処理されないことになります。これは望ましい動作ではない可能性があります。