Wildfly 10 jms 作为 XA 事务的一部分将消息发送到队列
Wildfly 10 jms send Message to queue as part of XA transaction
我最近不得不支持一位同事验证为什么某些系统测试没有通过 wildfly,系统测试在 weblogic 和 glass fish 上始终通过。
分析日志后,很明显原因与后备线程发送的 JMS 消息过早提交到队列有关,而预期消息将在入口点容器管理事务时提交MDB 的提交。因此消息在发送消息的 MDB 完成之前就已经发出 运行.
在 weblogic 中,为了实现预期的行为,您需要确保在采用 XA 配置的容器提供的连接工厂时,将 connection.createseesion 设置为
交易=真和
确认 = 会话已处理。
在与此 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属性的连接池工厂,容器应该立即将事务的提交绑定到父事务的生命周期。
请参阅下面关于 Java:/JmsXa 连接工厂的官方文档。
https://docs.jboss.org/author/display/WFLY10/Messaging+configuration
我的同事最初使用的是非池化连接工厂,但此后注入信息参考已得到修复。我已经尝试了 shed 消息中所有可能的参数组合,但我的结果是:
发送过早或从未发送过。
总而言之,所有其他资源都是 XA。即 oracle 数据库正在使用 XA 驱动程序。
任何人都可以确认仅在父事务提交时发送 JMS 消息是否有效,如果有效,会话是如何配置的?
我会检查我的同事是否没有在 Men's 自己使用的连接工厂的配置方面犯错,以使用来自 queue.but 的消息,如果那个也是 XA.. .那就麻烦大了
问题已解决。
在事务结束时将 JMS 消息提交到队列非常有效。
问题有两个方面:
(a) 我正在查看的第一个代码点解决了这个问题是不正确的。有人决定编写自己的发送电报到其他地方的队列 API,并且没有使用中央 API 发送电报,因此我对注入连接工厂的任何修改实际上都没有生效。陈旧的连接工厂仍在使用。
(b) 一旦发现正确的 API,就很容易通过使用上面 post 中提到的 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
引用 1:
This method has been superseded by the method createSession(int
sessionMode) which specifies the same information using a single
argument, and by the method createSession() which is for use in a Java
EE JTA transaction. Applications should consider using those methods
instead of this one.
引用 2:
In a Java EE web or EJB container, when there is an active JTA
transaction in progress:
Both arguments transacted and acknowledgeMode are ignored. The session will participate in the JTA transaction and will be committed
or rolled back when that transaction is committed or rolled back, not
by calling the session's commit or rollback methods. Since both
arguments are ignored, developers are recommended to use
createSession(), which has no arguments, instead of this method.
也就是说,代码片段在:
http://www.mastertheboss.com/jboss-server/jboss-jms/sending-jms-messages-over-xa-with-wildfly-jboss-as
不合适。应该做的是在没有任何参数的情况下创建会话并让容器处理其余部分。
它做得很好。
我最近不得不支持一位同事验证为什么某些系统测试没有通过 wildfly,系统测试在 weblogic 和 glass fish 上始终通过。
分析日志后,很明显原因与后备线程发送的 JMS 消息过早提交到队列有关,而预期消息将在入口点容器管理事务时提交MDB 的提交。因此消息在发送消息的 MDB 完成之前就已经发出 运行.
在 weblogic 中,为了实现预期的行为,您需要确保在采用 XA 配置的容器提供的连接工厂时,将 connection.createseesion 设置为 交易=真和 确认 = 会话已处理。
在与此 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属性的连接池工厂,容器应该立即将事务的提交绑定到父事务的生命周期。
请参阅下面关于 Java:/JmsXa 连接工厂的官方文档。
https://docs.jboss.org/author/display/WFLY10/Messaging+configuration
我的同事最初使用的是非池化连接工厂,但此后注入信息参考已得到修复。我已经尝试了 shed 消息中所有可能的参数组合,但我的结果是: 发送过早或从未发送过。
总而言之,所有其他资源都是 XA。即 oracle 数据库正在使用 XA 驱动程序。
任何人都可以确认仅在父事务提交时发送 JMS 消息是否有效,如果有效,会话是如何配置的?
我会检查我的同事是否没有在 Men's 自己使用的连接工厂的配置方面犯错,以使用来自 queue.but 的消息,如果那个也是 XA.. .那就麻烦大了
问题已解决。
在事务结束时将 JMS 消息提交到队列非常有效。
问题有两个方面: (a) 我正在查看的第一个代码点解决了这个问题是不正确的。有人决定编写自己的发送电报到其他地方的队列 API,并且没有使用中央 API 发送电报,因此我对注入连接工厂的任何修改实际上都没有生效。陈旧的连接工厂仍在使用。
(b) 一旦发现正确的 API,就很容易通过使用上面 post 中提到的 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
引用 1:
This method has been superseded by the method createSession(int sessionMode) which specifies the same information using a single argument, and by the method createSession() which is for use in a Java EE JTA transaction. Applications should consider using those methods instead of this one.
引用 2:
In a Java EE web or EJB container, when there is an active JTA transaction in progress:
Both arguments transacted and acknowledgeMode are ignored. The session will participate in the JTA transaction and will be committed or rolled back when that transaction is committed or rolled back, not by calling the session's commit or rollback methods. Since both arguments are ignored, developers are recommended to use createSession(), which has no arguments, instead of this method.
也就是说,代码片段在: http://www.mastertheboss.com/jboss-server/jboss-jms/sending-jms-messages-over-xa-with-wildfly-jboss-as
不合适。应该做的是在没有任何参数的情况下创建会话并让容器处理其余部分。 它做得很好。