60.10. CDI 事件端点


可从 Camel 2.17 开始

CDI 事件端点使用 Camel 路由桥接 CDI 事件 ,以便 CDI 事件可以从 Camel 消费者(由 Camel 生产者负责)无缝观察/消耗(重新启动/触发)。

Camel CDI 提供的 CdiEventEndpoint<T > bean 用于观察/消耗 事件类型 为 T 的 CDI 事件,例如:

@Inject
CdiEventEndpoint<String> cdiEventEndpoint;

from(cdiEventEndpoint).log("CDI event received: ${body}");
Copy to Clipboard Toggle word wrap

这等同于编写:

@Inject
@Uri("direct:event")
ProducerTemplate producer;

void observeCdiEvents(@Observes String event) {
    producer.sendBody(event);
}

from("direct:event").log("CDI event received: ${body}");
Copy to Clipboard Toggle word wrap

相反, CdiEventEndpoint<T > bean 可以用来生成 / fire CDI 事件,其 事件类型 为 T,例如:

@Inject
CdiEventEndpoint<String> cdiEventEndpoint;

from("direct:event").to(cdiEventEndpoint).log("CDI event sent: ${body}");
Copy to Clipboard Toggle word wrap

这等同于编写:

@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}");
Copy to Clipboard Toggle word wrap

或者使用 Java 8 lambda 表达式:

@Inject
Event<String> event;

from("direct:event")
    .process(exchange -> event.fire(exchange.getIn().getBody(String.class)))
    .log("CDI event sent: ${body}");
Copy to Clipboard Toggle word wrap

特定 CdiEventEndpoint< T  > 注入点 的类型 变量 T (resp)。 

@Inject
@FooQualifier
CdiEventEndpoint<List<String>> cdiEventEndpoint;

from("direct:event").to(cdiEventEndpoint);

void observeCdiEvents(@Observes @FooQualifier List<String> event) {
    logger.info("CDI event: {}", event);
}
Copy to Clipboard Toggle word wrap

当 CDI 容器中有多个 Camel 上下文时,Camel 上下文 bean qualifiers (如 @ContextName )可用于确定 CdiEventEndpoint<T& gt; 注入点,例如:

@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);
}
Copy to Clipboard Toggle word wrap

请注意,CDI 事件 Camel 端点动态地为 事件类型 和事件 限定组合添加 观察器 方法 ,并且完全依赖于容器类型safe observer 解析,从而尽可能有效地实施。

另外,作为 CDI 类型安全特性 和 Camel 组件模型 的动态 性质之间的争议会非常高,因此无法通过 URI 创建 CDI 事件 Camel 端点的实例。实际上,CDI 事件组件的 URI 格式是:

cdi-event://PayloadType<T1,...,Tn>[?qualifiers=QualifierType1[,...[,QualifierTypeN]...]]
Copy to Clipboard Toggle word wrap

使用 authority PayloadType (resp.. QualifierType)是有效负载的 URI 转义的完全限定名称(resp. qua. qualifier)原始类型,后跟类型参数参数参数部分。这会导致 不友好的 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
Copy to Clipboard Toggle word wrap

但更根本上来说,随着 CDI 容器没有发现 Camel 上下文模型,在端点实例和观察程序方法之间可以有效绑定。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat