60.10. CDI イベントエンドポイント
Camel 2.17 以降で利用可能
CDI イベントエンドポイントは、CDI イベント を Camel ルートにブリッジし、CDI イベントを (各 Camel producer によって) Camel consumer からシームレスに (それぞれ生成/起動して) 監視/消費できるようにします。
Camel CDI が提供する CdiEventEndpoint<T>
Bean を使用して、イベントタイプ が T
である CDI イベントを監視/消費できます。次に例を示します。
@Inject CdiEventEndpoint<String> cdiEventEndpoint; from(cdiEventEndpoint).log("CDI event received: ${body}");
これは次のように記述することと同じです:
@Inject @Uri("direct:event") ProducerTemplate producer; void observeCdiEvents(@Observes String event) { producer.sendBody(event); } from("direct:event").log("CDI event received: ${body}");
逆に、CdiEventEndpoint<T>
Bean を使用して、イベントタイプ が T
である CDI イベントを生成/起動できます。次に例を示します。
@Inject CdiEventEndpoint<String> cdiEventEndpoint; from("direct:event").to(cdiEventEndpoint).log("CDI event sent: ${body}");
これは次のように記述することと同じです:
@Inject Event<String> event; from("direct:event").process(new Processor() { @Override public void process(Exchange exchange) { event.fire(exchange.getBody(String.class)); } }).log("CDI event sent: ${body}");
または、Java 8 lambda 式を使用します。
@Inject Event<String> event; from("direct:event") .process(exchange -> event.fire(exchange.getIn().getBody(String.class))) .log("CDI event sent: ${body}");
特定の CdiEventEndpoint<T>
注入ポイントの型変数 T
(resp. 修飾子) は、パラメーター化された イベント型 (resp. イベント修飾子) に自動的に変換されます。以下に例を示します。
@Inject @FooQualifier CdiEventEndpoint<List<String>> cdiEventEndpoint; from("direct:event").to(cdiEventEndpoint); void observeCdiEvents(@Observes @FooQualifier List<String> event) { logger.info("CDI event: {}", event); }
複数の Camel コンテキストが CDI コンテナーに存在する場合、@ContextName
などの Camel コンテキスト Bean 修飾子を使用して、CdiEventEndpoint<T>
注入ポイントを修飾できます。次に例を示します。
@Inject @ContextName("foo") CdiEventEndpoint<List<String>> cdiEventEndpoint; // Only observes / consumes events having the @ContextName("foo") qualifier from(cdiEventEndpoint).log("Camel context (foo) > CDI event received: ${body}"); // Produces / fires events with the @ContextName("foo") qualifier from("...").to(cdiEventEndpoint); void observeCdiEvents(@Observes @ContextName("foo") List<String> event) { logger.info("Camel context (foo) > CDI event: {}", event); }
CDI イベントの Camel エンドポイントは、イベントタイプ と イベント修飾子 の一意の組み合わせごとに observer メソッド を動的に追加し、コンテナータイプセーフ observer resolution にのみ依存することに注意してください。これにより、実装が可能な限り効率的になります。
さらに、CDI の タイプセーフな 性質と Camel コンポーネント モデルの 動的な 性質の間のインピーダンスが非常に高いため、URI を介して CDI イベント Camel エンドポイントのインスタンスを作成することはできません。実際、CDI イベントコンポーネントの URI 形式は次のとおりです。
cdi-event://PayloadType<T1,...,Tn>[?qualifiers=QualifierType1[,...[,QualifierTypeN]...]]
権限 PayloadType
(resp. QualifierType
) は、URI エスケープされたペイロード (resp. qualifier) の raw タイプの完全修飾名であり、その後に、ペイロードのパラメーター化された型の山括弧で区切られた型パラメーターセクションが続きます。これは、不親切な URI につながります。
cdi-event://org.apache.camel.cdi.example.EventPayload%3Cjava.lang.Integer%3E?qualifiers=org.apache.camel.cdi.example.FooQualifier%2Corg.apache.camel.cdi.example.BarQualifier
しかし、より根本的には、CDI コンテナーにはデプロイフェーズ中に Camel コンテキストモデルを検出する方法がないため、エンドポイントインスタンスとオブザーバーメソッド間の効率的なバインディングが妨げられます。