我最近不得不支持一位同事验证为什么某些系统测试没有通过wildfly,系统测试一直在weblogic和玻璃鱼上传递。
在分析了日志之后,很明显原因与备份线程发送的JMS消息过早地提交到队列有关,当期望是消息将在入口点容器管理事务时提交MDB承诺。因此,在发送它的MDB运行完毕之前,消息就会消失。
在weblogic中,为了实现预期的行为,您需要确保在获取容器(由XA配置)给出的连接工厂时,设置connection.createseesion transacted = true和 确认=会话处理。
在类似于此URL中描述的过程中 http://www.mastertheboss.com/jboss-server/jboss-jms/sending-jms-messages-over-xa-with-wildfly-jboss-as 除了在上面的代码片段中设置了自动确认并且第一个参数设置为false。
在使用我们的weblogic和glass fish配置时,没有提交任何内容,系统的行为就好像要回滚的JMS消息一样。
如果要使用上面示例中的配置,则会发生的情况是JMS消息立即发生,并且消费者MDB在生产者事务实际结束之前立即启动被触发,导致系统测试失败。
根据官方JMS配置,通过使用具有transaction = XA属性的connection-pooled工厂,容器应立即将事务的提交绑定到父事务的生命周期。
特别参见Java:/ JmsXa连接工厂的官方文档。
https://docs.jboss.org/author/display/WFLY10/Messaging+configuration
我的同事最初使用非池化连接工厂,但从那时起注射信息参考已被修复。我已经在棚文件中尝试了所有可能的参数组合,但我的结果是sitll: 要么发送太快,要么从未发送过。
总结所有其他资源都是XA。即oracle db正在使用XA驱动程序。
任何人都可以确认是否仅在父事务提交正在运行时发送JMS消息,如果是,那么如何配置会话?
我会检查我的同事是否在Men's自己使用的连接工厂的配置方面没有犯错误来消耗队列中的消息。但是如果那个也是XA ...那么它是一个大问题。
答案 0 :(得分:1)
所以问题是固定的。
在事务结束时将JMS消息提交到队列非常有效。
问题有两个: (a)我正在寻找的第一个代码地址问题是不正确的。有人决定将他自己的发送电报写入其他地方的队列API,并且没有使用中央API来进行电报,因此对注入连接工厂的任何修改实际上都没有生效。过时的连接工厂仍在使用中。
(b)一旦找到正确的API,就可以通过使用上面帖子中提到的widlfy XA池连接工厂来轻松实现该机制。 调整的一件事是connection.CreationSession api。
JEE 7中的API已经扩大,现在比jEE 6更好地记录。 要在容器中发送JMS消息作为XA事务的一部分,应该执行以下操作: connection.createSession()没有任何参数。
这可以在连接javadoc中轻松看到:
https://docs.oracle.com/javaee/7/api/javax/jms/Connection.html
QUOTE 1:
此方法已被createSession(int。)方法取代 sessionMode)使用单个指定相同的信息 参数,以及用于Java的createSession()方法 EE JTA交易。应用程序应考虑使用这些方法 而不是这一个。
第2条:
在Java EE Web或EJB容器中,存在活动JTA时 正在进行的交易:
两个参数transacted和acknowledgeMode都被忽略。会议将参与JTA交易并将提交 或者在提交或回滚该事务时回滚,而不是 通过调用会话的提交或回滚方法。既然两个 参数被忽略,建议开发人员使用 createSession(),它没有参数,而不是这个方法。
这意味着,代码片段在: http://www.mastertheboss.com/jboss-server/jboss-jms/sending-jms-messages-over-xa-with-wildfly-jboss-as
不合适。应该做的是创建没有任何参数的会话,并让容器处理其余的参数。 它做得很好。