60.10. CDI 事件端点
从 Camel 2.17 开始提供
CDI 事件端点通过 Camel 路由将 CDI 事件 桥接到 CDI 事件,以便无缝观察 CDI 事件(由 Camel 使用者生成/触发)(由 Camel producers)。
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 可以用来生成 / fire CDI 事件,其 事件类型 为 T,例如:
@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< > 注入点的 type 变量 T (resp.
T
@Inject
@FooQualifier
CdiEventEndpoint<List<String>> cdiEventEndpoint;
from("direct:event").to(cdiEventEndpoint);
void observeCdiEvents(@Observes @FooQualifier List<String> event) {
logger.info("CDI event: {}", event);
}
当 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);
}
请注意,CDI 事件 Camel 端点会动态地为 事件类型 和事件 限定符 组合添加 观察器方法 ,并且仅依赖于容器类型safe 观察器解析,这会导致实施效率更高。
此外,作为 CDI 的 typesafe nature 和 Camel 组件 模型 的动态性质 之间的障碍非常高,因此无法通过 URI 创建 CDI 事件 Camel 端点的实例。实际上,CDI 事件组件的 URI 格式是:
cdi-event://PayloadType<T1,...,Tn>[?qualifiers=QualifierType1[,...[,QualifierTypeN]...]]
由于 authority PayloadType (resp. QualifierType)是 URI 转义的完全限定名称(resp. qualifier) raw 类型,后跟由 payload 参数化类型的类型参数部分分隔的 type 参数部分。这会导致 不友好的 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 上下文模型的任何方法。