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 コンテキストモデルを検出する方法がないため、エンドポイントインスタンスとオブザーバーメソッド間の効率的なバインディングが妨げられます。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.