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 パターン](https://access.redhat.com/webassets/avalon/d/Red_Hat_Fuse-7.9-Apache_Camel_Development_Guide-ja-JP/images/d8db74c904cf11fd10b5b11794cb06b9/message_filter.gif)
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>
フィルタリングするエンドポイント (例: <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
の場合、エクスチェンジはフィルターブロック経由でルーティングされました。