我认为我在 JMS 和 JTA 方面没有得到正确的结果。我正在具有所有 CMT 的 Java EE 容器中运行。这是我正在做的事情:
- 在 SLSB 中,向数据库写入一些内容
- 使用与 SLSB 相同的方法,将消息发布到 JMS 队列
- 同一容器中的 MDB 监听 JMS 队列并获取消息
- MDB读取数据库
问题是,MDB 看不到看到步骤 1 中对数据库所做的更改。
我验证了步骤 1 和 2 发生在单个 XA 事务内,正如预期的那样。我的期望是,在第一个 XA 提交后,第二个 XA 事务将在步骤 3 开始。但 MDB 似乎是在提交消息的 XA 事务提交之前接收到消息的。
我的期望是否错误,而我所看到的却是正常的?
我在 JBoss 6 下运行。SLSB 是本地的。 SLSB 和 MDB 都在同一个应用程序中。
最佳答案
我发现问题了!我的 JMS 连接工厂不支持 XA。我在/XAConnectionFactory 中查找了我的 JMS 连接工厂。尽管有这个名称,但在 JBoss 中查找常规应用程序的资源是错误的。还有一个 java:/XAConnectionFactory ,它也不起作用。正确的资源名称是java:/JmsXA。我使用了它,一切都按预期工作。
感谢@strmqm将我推向正确的方向。
关于Java EE 中的 JMS 和 JTA 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7062242/