0

我是 CDI 和 EJB 的新手,我刚刚创建了一个 jboss Web 应用程序。不过,另外,我还希望这个应用程序能够处理 rabbitmq 消息。但是,在处理这些时,我想做一些持久性工作,因为我一直在侦听来自以 @Startup 注释启动的应用程序范围 bean 的 rabbitmq 消息,因此我无法在此提交任何事务一种作用域,也就是说,当我离开应用程序作用域时,我将从这个作用域实例化的每个 bean 都将是应用程序作用域。当我尝试执行 em.getTransaction() 和 em.commit() 时,代码会爆炸,抱怨我无法在 JTA 事务下调用 getTransaction(),当我使用用户事务时,每个操作似乎都放在同一个事务上,直到终于回滚了

4

1 回答 1

1

CDI bean 不像 EJB 那样支持开箱即用的事务。所以你的选择是:

  1. 在接收到 RabbitMQ 消息后,调用一些 EJB(直接或通过观察者)来完成持久性工作。
  2. 使用以下之一将事务支持添加到您现有的 CDI bean - Apache DeltaSpikeSeam Persistence

根据您提供的信息,确实很难为您提供更多详细信息。但是,在概念层面上,上述方法之一可以解决问题。

此外, 的概念event scope似乎令人困惑。我会说你不需要它。上述方法之一就可以了。另外,请查看CDI 事件

于 2013-03-19T17:26:20.450 回答