当前位置: 首页 > 知识库问答 >
问题:

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

侯兴为
2023-03-14

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

分析日志后,很明显,原因与受支持线程发送的JMS消息过早提交到队列有关,当时的期望是当MDB的切入点容器托管事务提交时消息将被提交。因此,在发送消息的MDB运行完成之前,消息会发出。

在weblogic中,为了实现预期的行为,需要确保在获取容器(已配置XA)提供的连接工厂时,设置了连接。CreateSeVersion,Transact=true,Acknowledge=session Transact。

在一个类似于此URL中描述的过程中http://www.mastertheboss.com/jboss-server/jboss-jms/sending-jms-messages-over-xa-with-wildfly-jboss-as除了上面的代码片段之外,设置了自动确认,并且第一个参数设置为false。

当我们的weblogic和玻璃鱼配置被广泛使用时,什么都没有提交,系统的行为就像发送的JMS消息被回滚一样。

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

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

请参阅官方留档特别是关于Java:/JmsXa连接工厂。

https://docs.jboss.org/author/display/WFLY10/Messaging配置

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

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

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

我会检查我的同事是否在连接工厂的配置方面犯了错误,这些人自己使用连接工厂来消费队列外的消息。但如果那一个也是XA。。。那么这就是一个大问题。

共有1个答案

卜方伟
2023-03-14

所以问题已经解决了。

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

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

(b) 一旦找到了正确的API,就可以通过使用上面帖子中提到的widlfy XA Poolled connection factory轻松地使该机制工作。唯一需要调整的是连接。CreationSessionAPI。

JEE 7中的API已经被扩展,现在它比jEE 6中的更好地记录。要在容器中发送JMS消息作为XA事务的一部分,应该这样做:connection.create会话(),不带任何参数。

这在连接javadoc中很容易看到:

https://docs.oracle.com/javaee/7/api/javax/jms/Connection.html

引用1:

此方法已被使用单个参数指定相同信息的方法create会话(int sensionMode)和用于JavaEE JTA事务的方法create会话()所取代。应用程序应该考虑使用这些方法而不是这个方法。

引文2:

在Java EE web或EJB容器中,当有正在进行的活动JTA事务时:

事务处理的参数和确认模式都被忽略。会话将参与JTA事务,并在事务提交或回滚时提交或回滚,而不是通过调用会话的提交或回滚方法。由于这两个参数都被忽略,因此建议开发人员使用create会话(),它没有参数,而不是此方法。

也就是说,http://www.mastertheboss.com/jboss-server/jboss-jms/sending-jms-messages-over-xa-with-wildfly-jboss-as中的代码片段

是不合适的。应该做的是在没有任何参数的情况下创建会话,并让容器处理其余部分。它做得很好。

 类似资料:
  • 问题内容: 我试图将字符串消息发送到在weblogic服务器中创建的JMS队列中。我使用Eclipse IDE,当我运行Web应用程序时,出现以下错误,tomcat服务器关闭。错误是 请帮助我。谢谢和最诚挚的问候 问题答案: 基于对该问题的一些快速研究,它似乎是由于在应用服务器和客户端之间使用不同的JDK级别引起的。我看到的大多数示例都表明,在Java 5上运行Weblogic时在客户端上使用Ja

  • 我设置了一个EJB项目,使用JMS将持久性实体对象发送到MDB。我使用JBoss EAP 7,使用Apache ActiveMQ作为消息传递提供程序。我像这样设置ConnectionFactory和队列: 这是我的消息生成器,它接收“Account”实体对象作为参数并将其发送到队列: EntityEnqueueBean。Java语言 MDB从队列接收消息并对其进行处理: java账户 不确定我做错

  • 我是Spring JMS的新手。我的应用程序是使用Spring Boot开发的,并部署在JBoss EAP7.2.0中。我有一个远程队列,它是一个活动的MQ Artemis队列,也嵌入在JBoss EAP7.2.0中。有人能建议我如何使用Spring Boot的JmsTemplate向远程JMS队列发送消息吗?基本上,我不知道应该如何定义远程connectionFactory来连接到远程队列。

  • 我需要从web应用程序向外部JMS服务器发送消息。 我正在使用WebLogic,并且已经配置了一个外部JMS服务器/连接工厂/队列。 关于Java代码,该代码是否也适用于外部JMS服务器? 我试过了,但我错了,但是。。。它应该起作用吗? 谢啦

  • 在我的场景中,我希望用户订阅一个固定的websocketendpoint,并且在订阅时不需要提及队列名或主题。我想处理控制器内部的逻辑,以便从各自的队列中获取消息并将消息发送回每个用户。我想达到的目标是:- 我的客户端代码首先连接到websocketendpoint/websocket:- 然后通过websocket发送STOMP connect and subscribe帧 正在工作的服务器端代

  • 在我们的节奏工作流程中,我们通常需要等待一定时间的外部事件才能继续(即电子邮件阅读、链接点击等)。 我想知道什么是将这些事件通知我们工作流程的最佳方式。信号是正确的方式,还是我们应该创建一个等待事件的活动? 根据我所看到的,我们需要创建一个信号通道,但是上下文在活动中不可用。