8.2. Message Filter

概要

Massage Filter は、特定の基準に基づいて不要なメッセージを除外するプロセッサーです。Apache Camel では、図8.2「Message Filter パターン」 に示される Message Filter パターンは、Java DSL コマンド filter() によって実装されています。この filter() コマンドは単一の述語引数を取り、フィルターを制御します。述語が true の場合、受信メッセージは続行でき、述語が false の場合、受信メッセージはブロックされます。

図8.2 Message Filter パターン

Message Filter パターン

Java DSL の例

以下の例は、エンドポイント seda:a からエンドポイント seda:b へのルートを作成し、foo ヘッダーに bar: という値を持つメッセージ以外のすべてのメッセージをブロックする方法を示しています。

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
        from("seda:a").filter(header("foo").isEqualTo("bar")).to("seda:b");
    }
};

より複雑なフィルター述語を評価するため、XPath、XQuery、SQL (パートII「ルーティング式と述語言語」 を参照) などのサポートされているスクリプト言語のいずれかを呼び出すことができます。以下の例は、name 属性が James と等しい person 要素を含むメッセージ以外のすべてのメッセージをブロックするルートを定義しています。

from("direct:start").
        filter().xpath("/person[@name='James']").
        to("mock:result");

XML 設定の例

以下の例は、XML で XPath 述語を使用してルートを定義する方法を示しています (パートII「ルーティング式と述語言語」 を参照)。

<camelContext id="simpleFilterRoute" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="seda:a"/>
    <filter>
      <xpath>$foo = 'bar'</xpath>
      <to uri="seda:b"/>
    </filter>
  </route>
  </camelContext>
フィルタリングされたエンドポイントは </filter> タグの中に定義

フィルタリングするエンドポイント (例: <to uri="seda:b"/>) は、クロージングタグ </filter> の前に定義する必要があります。そうでない場合は、フィルターは反映されません (2.8 以降で省略するとエラーになります)。

Bean を使用したフィルタリング

フィルターの動作を定義するために Bean を使用した例を以下に示します。

from("direct:start")
     .filter().method(MyBean.class, "isGoldCustomer").to("mock:result").end()
     .to("mock:end");

public static class MyBean {
    public boolean isGoldCustomer(@Header("level") String level) {
        return level.equals("gold");
    }
}

stop() の使用

Camel 2.0 で利用可能

stop は、すべて のメッセージをフィルタリングする特別なタイプのフィルターです。stop は、Content-Based Router 内のいずれかの述語で停止する必要がある場合に使用すると便利です。

以下の例では、メッセージボディーに Bye という単語を含むメッセージが、ルート内でこれ以上伝播しないようにします。これは、when() 述語で .stop() を使用しないようにします。

from("direct:start")
    .choice()
        .when(bodyAs(String.class).contains("Hello")).to("mock:hello")
        .when(bodyAs(String.class).contains("Bye")).to("mock:bye").stop()
        .otherwise().to("mock:other")
    .end()
    .to("mock:result");

エクスチェンジがフィルターされたかどうかの確認

Camel 2.5 で利用可能

メッセージフィルター EIP は、フィルターが適用されたかどうかを示すプロパティーを、エクスチェンジに追加します。

プロパティーにはキー Exchange.FILTER_MATCHED があり、これには CamelFilterMatched の文字列値が含まれます。この値は、true または false を示すブール値です。値が true の場合、エクスチェンジはフィルターブロック経由でルーティングされました。