【问题标题】:Genetrate "Event Scoped" beans out off the application scope在应用程序范围之外生成“事件范围”bean
【发布时间】:2013-03-15 22:59:59
【问题描述】:

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

【问题讨论】:

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

标签: java jakarta-ee jpa cdi ejb-3.1


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多