Wildfly 10 jms将消息作为XA事务的一部分发送到队列

Wildfly 10 jms将消息作为XA事务的一部分发送到队列,jms,activemq,xa,Jms,Activemq,Xa,最近,我不得不支持一位同事验证为什么一些系统测试没有通过wildfly,即在weblogic和glass fish上一致通过的系统测试 分析日志后,很明显,原因与支持线程发送的JMS消息过早提交到队列有关,而预期消息将在MDB的入口点容器管理事务提交时提交。因此,在发送消息的MDB运行完毕之前,消息就会发出 在weblogic中,为了实现预期的行为,您需要确保在使用容器(已配置XA)提供的连接工厂时,将connection.createSeision设置为 Transact=true和 确认=已

最近,我不得不支持一位同事验证为什么一些系统测试没有通过wildfly,即在weblogic和glass fish上一致通过的系统测试

分析日志后,很明显,原因与支持线程发送的JMS消息过早提交到队列有关,而预期消息将在MDB的入口点容器管理事务提交时提交。因此,在发送消息的MDB运行完毕之前,消息就会发出

在weblogic中,为了实现预期的行为,您需要确保在使用容器(已配置XA)提供的连接工厂时,将connection.createSeision设置为 Transact=true和 确认=已处理的会话

与此URL中描述的过程类似 除非在上面的代码段中设置了自动确认,并且第一个参数设置为false

在使用weblogic和glass fish配置时,不会提交任何内容,系统的行为就好像发送的JMS消息要回滚一样

如果要使用上述示例中的配置,则会发生以下情况:JMS消息立即发送,消费者MDB在生产者事务实际结束之前立即启动,从而导致系统测试失败

根据正式的JMS配置,通过使用带有transaction=XA属性的连接池工厂,容器应该立即将事务的提交绑定到父事务的生命周期

有关Java:/JmsXa连接工厂,请参阅下面的官方文档

我的同事最初使用的是一个非池连接工厂,但是注入信息引用从那时起就被修复了。我尝试了shed消息中所有可能的参数组合,但结果是sitll: 要么发送得太早,要么从未发送过

总之,所有其他资源都是XA。即oracle db正在使用XA驱动程序

有人能确认发送JMS消息中是否仅当父事务提交工作时,以及会话是如何配置的吗


我将检查我的同事是否在男子自己使用的连接工厂的配置方面没有犯错误,以使用队列外的消息。。。那么这是一个大问题。

所以问题已经解决了

在事务结束时将JMS消息提交到队列可以完美地工作

这个问题有两个方面: (a) 我看到的第一段代码解决了这个问题,它是不正确的。有人决定自己编写发送电报到别处的队列API,并且没有使用中央API发送电报,因此对注入连接工厂的任何修改实际上都没有生效。陈旧的连接工厂仍在使用

(b) 一旦找到了正确的API,就可以通过使用上面文章中提到的widlfy XA Poold connection factory轻松地使该机制工作。 调整的一件事是connection.CreationSession api

JEE7中的API已经被放大,现在比JEE6中的API文档记录得更好。 要在容器中作为XA事务的一部分发送JMS消息,应执行以下操作: connection.createSession()不带任何参数

在连接javadoc中可以很容易地看到这一点:

引文1:

此方法已被createSession(int)方法取代 sessionMode),它使用单个 参数,并通过在Java中使用的方法createSession() EE JTA交易。应用程序应该考虑使用这些方法 而不是这个

引文2:

在JavaEEWeb或EJB容器中,当存在活动JTA时 正在进行的交易:

已处理的参数和acknowledgeMode都将被忽略。该会话将参与JTA事务并提交 或在提交或回滚该事务时回滚,而不是 通过调用会话的提交或回滚方法。既然都 参数被忽略,建议开发人员使用 createSession(),它没有参数,而不是此方法

这意味着,中的代码段:

这是不恰当的。我们应该做的是在没有任何参数的情况下创建会话,并让容器处理其余部分。
这很好。

您知道最近的Wildfly版本中JMS的XA是否是真正的XA吗?在JBoss5中,它是一个“假”XA,当服务器在测试情况下被杀死时,它会有效地导致不一致状态。我们现在正在努力,谢谢你的观点。虽然我现在才看到你的评论,但我已经用你的贡献更新了。