【问题标题】:Asynchronous events in camel-cdicamel-cdi 中的异步事件
【发布时间】:2017-08-29 17:46:38
【问题描述】:

根据http://camel.apache.org/cdi.html

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

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

from("direct:event")
 .log("CDI event received: ${body}");

等价于

@Inject
CdiEventEndpoint<String> cdiEventEndpoint;

from(cdiEventEndpoint).log("CDI event received: ${body}");

如何用

转换示例
 producer.asyncSendBody(...)

使用 CdiEventEndpoint 。 提前致谢!

【问题讨论】:

  • 不太熟悉 Camel,但您是在谈论 CDI 2.0 异步事件吗?
  • 不是,我知道我可以编写一个 EJB 来异步触发事件。据我了解,EJB 池中的一个线程然后等待事件被处理。 Camel 已经提供了一个异步路由引擎和“asyncSendBody”方法。我宁愿直接使用它(如上面的工作代码),但使用更好的 CdiEventEndpoint 。更准确地说,我的项目中有工作代码,它使用 ProducerTemplate 对 CDI 事件进行排队(几乎是第一个 Code sn-p)。我想将它们重构为第二个 sn-p,但在某些方面保持第三个 sn-p 的异步性质。

标签: java apache-camel cdi java-ee-7 apache-camel-cdi


【解决方案1】:

我从未实际测试过这一点,但从文档中您应该能够将“direct”替换为“seda”以进行 asych:

@Inject
@Uri("seda:event")
ProducerTemplate producer;
...

在您澄清之后,我想您可能正在寻找骆驼中的异步路由引擎,通过将threads() 插入java dsl 设置中来使用:

from("direct:event") // using a producer "direct:event" in an @Observes method
    .threads()
    .log("...")

或关于 cdi 事件设置

from(cdiEventEndpoint) // using @Inject CdiEventEndpoint<String> cdiEventEndpoint
    .threads()
    .log("...")

【讨论】:

  • 嗨@mtj,不幸的是,这不是我要问的,我想使用 CdiEventEndpoint 并摆脱 ProducerTemplate。然后在路由定义中,您将为其提供的 URI 位于 cdiEventEndpoint 之前,因此不起任何作用。我已经编辑了这个问题,将您的建议以略微修改的形式纳入其中。这可能有效!
  • @JoshOvi 请参阅编辑。我希望这次我得到了你的问题。 :-)
  • 是的@mtj!这就是我所做的。大约from(cdiEventEndpoint).inOnly("seda:asyc").log("CDI event sent: ${body}");
猜你喜欢
  • 1970-01-01
  • 2023-02-10
  • 2014-09-08
  • 2022-10-12
  • 2018-12-26
  • 2018-08-26
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
相关资源
最近更新 更多