第62章 Guava EventBus
Guava EventBus コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.10.0 以降で利用可能
Google Guava EventBus は、コンポーネントを相互に明示的に登録しなくても、コンポーネント間のパブリッシュ/サブスクライブスタイルの通信を可能にします(そのため、相互に認識する必要があります)。guava-eventbus: コンポーネントは、Camel と Google Guava EventBus インフラストラクチャー間の統合ブリッジを提供します。後者のコンポーネントでは、Guava
EventBus で交換されるメッセージは、Camel ルートに透過的に転送できます。EventBus コンポーネントを使用すると、Camel エクスチェンジのボディーを Guava EventBus にルーティングすることもできます。
Maven ユーザーは、このコンポーネントの
pom.xml に以下の依存関係を追加する必要があります。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-guava-eventbus</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
guava-eventbus:busName[?options]
busName は、Camel レジストリーにある
com.google.common.eventbus.EventBus インスタンスの名前を表します。
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| 名前 | デフォルト値 | 説明 |
|---|---|---|
eventClass
|
null
|
Camel 2.10: ルートのコンシューマー側で使用された場合、は EventBus から受信したイベントを、eventClass の クラスおよびスーパークラス にフィルターします。このオプションの null 値は、これを java.lang.Object に設定するのと同じです。つまり、コンシューマーはイベントバスに受信するすべてのメッセージを取得します。このオプションは listenerInterface オプションと併用できません。
|
listenerInterface
|
null
|
Camel 2.11: @Subscribe アノテーションが付けられたメソッドを持つインターフェイス。動的プロキシーはインターフェイスで作成され、EventBus リスナーとして登録できるようにします。特に、マルチイベントリスナーを作成し、DeadEvent を適切に処理する際に役立ちます。このオプションは eventClass オプションと併用できません。
|
使用方法 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ルートのコンシューマー側で
guava-eventbus コンポーネントを使用すると、Guava EventBus に送信されたメッセージをキャプチャーし、Camel ルートに転送します。Guava EventBus コンシューマーは受信メッセージを 非同期的 に処理します。
SimpleRegistry registry = new SimpleRegistry();
EventBus eventBus = new EventBus();
registry.put("busName", eventBus);
CamelContext camel = new DefaultCamelContext(registry);
from("guava-eventbus:busName").to("seda:queue");
eventBus.post("Send me to the SEDA queue.");
ルートのプロデューサー側で
guava-eventbus コンポーネントを使用すると、Camel エクスチェンジのボディーが Guava EventBus インスタンスに転送されます。
SimpleRegistry registry = new SimpleRegistry();
EventBus eventBus = new EventBus();
registry.put("busName", eventBus);
CamelContext camel = new DefaultCamelContext(registry);
from("direct:start").to("guava-eventbus:busName");
ProducerTemplate producerTemplate = camel.createProducerTemplate();
producer.sendBody("direct:start", "Send me to the Guava EventBus.");
eventBus.register(new Object(){
@Subscribe
public void messageHander(String message) {
System.out.println("Message received from the Camel: " + message);
}
});
DeadEvent に関する考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Guava EventBus の設計によって生じる制限により、
@Subscribe メソッドでアノテーションが付けられたクラスを作成せずにリスナーによって受信されるイベントクラスを指定できないことに注意してください。この制限は、eventClass オプションが指定されたエンドポイントが可能なすべてのイベント(java.lang.Object)をリッスンし、ランタイム時に適切なメッセージをプログラムでフィルターすることを意味します。以下のスニッシングは、Camel コードベースからの適切な抜粋を示しています。
@Subscribe
public void eventReceived(Object event) {
if (eventClass == null || eventClass.isAssignableFrom(event.getClass())) {
doEventReceived(event);
...
このアプローチの欠点は、Camel が使用する
EventBus インスタンスが com.google.common.eventbus.DeadEvent 通知を生成しないことです。Camel が正確に指定されたイベントのみをリッスンするようにするには(そのため、DeadEvent サポートを有効にする)、listenerInterface endpoint オプションを使用します。Camel は、後者のオプションで指定したインターフェイスで動的プロキシーを作成し、インターフェイスハンドラーメソッドによって指定されたメッセージのみをリッスンします。SpecificEvent インスタンスのみを処理する単一のメソッドインターフェイスの例を以下に示します。
package com.example;
public interface CustomListener {
@Subscribe
void eventReceived(SpecificEvent event);
}
上記のリスナーは、以下のようにエンドポイント定義で使用できます。
from("guava-eventbus:busName?listenerInterface=com.example.CustomListener").to("seda:queue");
複数のタイプのイベントの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Guava EventBus コンシューマーが消費する複数のタイプのイベントを定義するには、リスナーインターフェイスが
@Subscribe アノテーションが付けられた複数のメソッドを提供できるため、listenerInterface エンドポイントオプションを使用します。
package com.example;
public interface MultipleEventsListener {
@Subscribe
void someEventReceived(SomeEvent event);
@Subscribe
void anotherEventReceived(AnotherEvent event);
}
上記のリスナーは、以下のようにエンドポイント定義で使用できます。
from("guava-eventbus:busName?listenerInterface=com.example.MultipleEventsListener").to("seda:queue");