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 キュー からメッセージを選択する場合には、注意が必要です。フィルタープロセッサーを使用する場合、ブロックされたメッセージは単に破棄されます。したがって、メッセージがキューから消費される場合(各メッセージは 「Competing Consumers」の一度だけ消費可能)、ブロックされたメッセージは全く処理されません。これは望ましい動作ではない可能性があります。