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
CdiEventEndpoint<String> cdiEventEndpoint;
from(cdiEventEndpoint).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
CdiEventEndpoint<String> cdiEventEndpoint;
from("direct:event").to(cdiEventEndpoint).log("CDI event sent: ${body}");
これは次のように記述することと同じです:
または、Java 8 lambda 式を使用します。
特定の CdiEventEndpoint<T>
注入ポイントの型変数 T
(resp. 修飾子) は、パラメーター化された イベント型 (resp. イベント修飾子) に自動的に変換されます。以下に例を示します。
複数の Camel コンテキストが CDI コンテナーに存在する場合、@ContextName
などの Camel コンテキスト Bean 修飾子を使用して、CdiEventEndpoint<T>
注入ポイントを修飾できます。次に例を示します。
CDI イベントの Camel エンドポイントは、イベントタイプ と イベント修飾子 の一意の組み合わせごとに observer メソッド を動的に追加し、コンテナータイプセーフ observer resolution にのみ依存することに注意してください。これにより、実装が可能な限り効率的になります。
さらに、CDI の タイプセーフな 性質と Camel コンポーネント モデルの 動的な 性質の間のインピーダンスが非常に高いため、URI を介して CDI イベント Camel エンドポイントのインスタンスを作成することはできません。実際、CDI イベントコンポーネントの URI 形式は次のとおりです。
cdi-event://PayloadType<T1,...,Tn>[?qualifiers=QualifierType1[,...[,QualifierTypeN]...]]
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-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 コンテキストモデルを検出する方法がないため、エンドポイントインスタンスとオブザーバーメソッド間の効率的なバインディングが妨げられます。