Java Genetrate“;“事件范围”;超出了应用范围

Java Genetrate“;“事件范围”;超出了应用范围,java,jakarta-ee,jpa,cdi,ejb-3.1,Java,Jakarta Ee,Jpa,Cdi,Ejb 3.1,我是CDI和EJB的新手,我刚刚创建了一个jboss web应用程序。不过,除此之外,我还希望该应用程序能够处理rabbitmq消息。在处理这些时,我想做一些持久性工作,但是,由于我一直在侦听来自应用程序范围bean的rabbitmq消息,该bean是以@Startup注释启动的,因此我无法在这种范围内提交任何事务,也就是说,因为我正在离开应用程序范围,我将从这个范围中创建的每个bean都是应用程序范围的。当我尝试执行em.getTransaction()和em.commit()时,代码会爆炸,

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

CDIBeans不支持像EJB那样开箱即用的事务。因此,您的选择是:

  • 在收到RabbitMQ消息后,调用一些EJB(直接或通过观察者)来执行持久性工作
  • 使用以下或选项之一将事务支持添加到现有CDIBean
  • 根据你提供的信息,很难给你更多的细节。然而,在概念层面上,上述方法中的一种会起作用


    此外,
    事件范围
    的概念似乎令人困惑。我想说你不需要它。上述方法之一就可以了。另外,看一看。

    我注意到这个问题被投票赞成结束。请不要这样做,而是评论它,这样我可以改进它。谢谢。“无法提交此类范围内的任何事务”您的意思是什么,您是否遇到错误?交易没有开始?事务回滚?此外,我认为发布一些代码可以帮助我们理解这个问题。我对问题进行了编辑,进一步澄清了“代码爆炸,抱怨JPA”。。。发布错误跟踪是否如此困难?请提供更多细节,否则您的问题将被关闭。我的问题是概念性的。它不是关于修复一个确切的bug,而是关于如何在CDI/EJB3.1中生成和持久化事件。我已经尝试了几种方法来解决这个问题,但我没有成功,所以我最终使用了一个非常丑陋的基于体系结构的补丁,我无法轻松访问我过去拥有的痕迹。我之所以提出这个问题,是因为我想知道执行上述任务的正确方式。我想知道,你威胁关闭这个问题,甚至不提供评论就试图关闭它的行为是否违背了这个网站的目标和性质。