【问题标题】:How to keep CDI context in an asynchronous event on Wildfly 11?如何在 Wildfly 11 的异步事件中保持 CDI 上下文?
【发布时间】:2018-12-26 07:23:54
【问题描述】:

我们正在开发 Wildfly 11,需要在时间紧迫(低于 300 毫秒)的情况下应答休息呼叫。 我已经调整了计算结果的算法以回答低于这个阈值。但在我回答后,我想用计算结果触发一些预处理(创建一个对象,将其存储在数据库中)。

此预处理器注入部分是 SessionScoped 的服务。

我的第一次尝试是在计算出响应后立即触发 javax.enterprise.event。这行得通,但事实证明,CDI bean 中的事件不是异步的。所以 rest 调用花费的时间比必要的要长,因为它执行后处理器。

现在我按照this文章中的建议,将处理bean设为无状态并注释观察者方法@Asynchronous

调用现在是异步触发的,但我会丢失预处理器中需要的 CDI 上下文。否则注入的服务将不起作用。

我现在 cdi 2.0 在 Event 上提供了一个 fireAsync,但 Wildfly 11 仅包含 cdi 1.2。所以这不是一个选择。

【问题讨论】:

  • 不幸的是,在解决以下 CDI 问题之前,即使 fireAsync 也无法使用:将上下文传播到异步调用。 issues.jboss.org/browse/CDI-635
  • 哦。好的。因此,我们需要考虑在这一点上进行架构更改。谢谢。

标签: java asynchronous ejb wildfly cdi


【解决方案1】:

根据提交事务的时间,解决方案是使用 @Observes(during = TransactionPhase.AFTER_COMPLETION) ?

【讨论】:

  • 我已经偶然发现了该选项,但这对我的情况没有帮助,因为该事件不是从事务中触发的。
猜你喜欢
  • 2022-10-12
  • 2017-08-29
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2018-01-16
  • 2017-08-30
相关资源
最近更新 更多