JBoss没有';t发送一个JmsTemplate(Spring)消息

JBoss没有';t发送一个JmsTemplate(Spring)消息,spring,jboss,jmstemplate,Spring,Jboss,Jmstemplate,实际上JBoss确实会发送消息,但只有当EJB启动的当前事务完成时才会发送 JBoss4.0.3和Spring的JmsTemplate存在这个问题。EJB向队列发送消息,其中临时队列作为reply_to字段。然后,在同一事务中,我们侦听第一个MDB给出的响应。问题在于,JmsTemplate的方法“send”在事务完成后不会执行。因此,当消息被发送到队列并由MDB处理时,临时队列的侦听器就消失了 这称为“同步接收” 有两件事改变了这种行为,但确实引起了一些担忧: 将EJB的事务类型更改为BMT。

实际上JBoss确实会发送消息,但只有当EJB启动的当前事务完成时才会发送

JBoss4.0.3和Spring的JmsTemplate存在这个问题。EJB向队列发送消息,其中临时队列作为reply_to字段。然后,在同一事务中,我们侦听第一个MDB给出的响应。问题在于,JmsTemplate的方法“send”在事务完成后不会执行。因此,当消息被发送到队列并由MDB处理时,临时队列的侦听器就消失了

这称为“同步接收”

有两件事改变了这种行为,但确实引起了一些担忧:

  • 将EJB的事务类型更改为BMT。(关注:BMT糟糕透了)

  • 创建一个线程,它只需调用JmsTemplate.send()方法

  • 作为一个旁注,这是一个EJB,它在WebLogic环境中正常工作,消息在它应该被发送的时候,在事务的中间,而不是在它结束时被发送。


    谢谢你的帮助

    JBoss的行为是正确的。JMS是一个事务API,仅当tx提交时才应执行发送


    也许可以说服JmsTemplate不要使用当前事务上下文,尽管它试图向您隐藏jmsapi的不愉快之处。

    您可以将JMS模板包装在代码中,可以是无状态会话bean,也可以是使用Spring事务管理的服务方法,使用新的事务传播的。这样,消息的发送在其自己的事务中,该事务将在包装事务的范围之外提交消息的发送


    我不知道为什么这会在Weblogic上起作用。我的猜测是,在Weblogic上,它没有将队列识别为XA队列。

    “只有在tx提交时才应执行and sends”,但这不允许使用任何可能的同步接收。在事务上下文中,是的。但是,如果您能够说服JmsTemplate在该上下文之外执行,那么您应该可以。或者,不要使用JMSTemplate——它只是一个围绕JMS API的包装器。我将您的答案标记为正确答案,因为它让我找到了正确的方向。为了不使用当前的事务上下文,我使用了问题中描述的第二个选项。谢谢Jason,我将看看这个解决方案,看看是否能按预期工作。我测试过的每个JBoss版本都有相同的行为:4.2、5.0和5.1