javaee中的JMS和JTA事务

javaee中的JMS和JTA事务,jms,ejb,jta,message-driven-bean,Jms,Ejb,Jta,Message Driven Bean,我认为我在JMS和JTA方面做得不对。我在一个包含所有CMT的JavaEE容器中运行。以下是我正在做的: 在SLSB中,向数据库写入内容 使用与SLSB相同的方法,将消息发布到JMS队列 同一容器中的MDB侦听JMS队列并拾取消息 MDB读取数据库 问题是,MDB看不到在步骤1中对数据库所做的更改 正如预期的那样,我验证了步骤1和步骤2发生在单个XA事务中。我的期望是,在提交第一个XA之后,第二个XA事务将在步骤3开始。但MDB似乎在提交发布消息的XA事务之前就收到了消息 我的期望是错误的,我看

我认为我在JMS和JTA方面做得不对。我在一个包含所有CMT的JavaEE容器中运行。以下是我正在做的:

  • 在SLSB中,向数据库写入内容
  • 使用与SLSB相同的方法,将消息发布到JMS队列
  • 同一容器中的MDB侦听JMS队列并拾取消息
  • MDB读取数据库
  • 问题是,MDB看不到在步骤1中对数据库所做的更改

    正如预期的那样,我验证了步骤1和步骤2发生在单个XA事务中。我的期望是,在提交第一个XA之后,第二个XA事务将在步骤3开始。但MDB似乎在提交发布消息的XA事务之前就收到了消息

    我的期望是错误的,我看到的是正常的吗


    我在JBoss6下运行。SLSB是本地的。SLSB和MDB都在同一个应用程序中。

    我在使用WebLogic 7构建的应用程序中看到了一个概念上类似的问题。tx2(由tx1中的JMS发送启动)尝试读取时,来自tx1的DB提交尚未完成

    问题在于,我们的配置涉及一个WLS 7 XA仿真层,该层具有非XA db连接(到Oracle db)。这种风险是这条捷径的一部分。显然,如果我们和真正的XA一起一直到DB,这个洞就会关闭。从来没有测试过


    你说这是JBoss。有没有可能他们有一些类似的垫片绕过XA,并给出同样令人惊讶的结果?

    我发现了问题!我的JMS连接工厂不知道XA。我在/XAConnectionFactory中查找了我的JMS连接工厂。不管名称如何,在JBoss中查找常规应用程序的资源都是错误的。还有一个java:/XAConnectionFactory,它也不起作用。正确的资源名称是java:/JmsXA。我用过它,一切都正常


    感谢@strmqm为我指明了正确的方向。

    您能说明为什么要这样做吗?你的db是否支持触发事件当它更改表时,你可以让它向你的应用程序发出http请求,声明表名、操作(插入、更新等)和id,然后你的应用程序侦听它并执行它的操作。我通常认为MDB在步骤(1+2)中的事务提交之前不会触发,在这一点之前,消息应该在事务中“锁定”,并且在提交之前通常不可见(尽管这里有时有特定于提供程序的警告)。对于给出的信息很难确定,但如果第2步不是在事务中完成的,它将解释您看到的情况-尽管我知道您说您已经验证了第1+2步是原子的,但这有没有可能是错误的?@Antonio这将使其过于复杂,并与DB供应商紧密联系。我已经使用了大量JMS,在这个项目中,更多地利用JMS更有意义。@strmqm这也是我的想法。我将更仔细地测试,以确保步骤1+2确实在XA事务中完成。很高兴,我过去也经历过类似的经历!