JBoss不发送JmsTemplate(Spring)消息

时间:2009-06-22 09:25:11

标签: spring jboss jmstemplate

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

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

这称为“同步接收”

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

  1. 将EJB的事务类型更改为BMT。 (关注:BMT很糟糕)

  2. 创建一个线程,它所做的就是调用JmsTemplate.send()方法。

  3. 作为旁注,这是一个在weblogic环境中正常运行的EJB,并且消息确实会在事务发生时发送,而不是在事务结束时发送。

    感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

JBoss的行为是正确的。 JMS是一个事务API,只有在tx提交时才会执行发送。

有可能说服JmsTemplate不使用当前的事务上下文,尽管它试图隐藏JMS API的不愉快。

答案 1 :(得分:0)

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

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