好吧,实际上JBoss确实发送了消息,但只有当EJB启动的当前事务完成时才会发送消息。
JBoss 4.0.3和Spring的JmsTemplate存在这个问题。 EJB将消息发送到具有临时队列的队列作为reply_to字段。然后,在同一个事务中,我们监听第一个MDB给出的响应。问题是在事务完成后不执行JmsTemplate的方法“send”。因此,当消息发送到队列并由MDB处理时,临时队列的监听器就会消失。
这称为“同步接收”
有两件事改变了这种行为,但确实引起了一些担忧:
将EJB的事务类型更改为BMT。 (关注:BMT很糟糕)
创建一个线程,它所做的就是调用JmsTemplate.send()方法。
作为旁注,这是一个在weblogic环境中正常运行的EJB,并且消息确实会在事务发生时发送,而不是在事务结束时发送。
感谢您的帮助。
答案 0 :(得分:1)
JBoss的行为是正确的。 JMS是一个事务API,只有在tx提交时才会执行发送。
有可能说服JmsTemplate不使用当前的事务上下文,尽管它试图隐藏JMS API的不愉快。
答案 1 :(得分:0)
您可以使用Spring的事务管理将JMS模板包装在代码中,无论是无状态会话bean还是服务方法,它使用REQUIRES_NEW的事务传播。这样,消息的发送就在它自己的事务中,它将提交在包装事务范围之外发送消息。
我不知道为什么这会对Weblogic起作用。我的猜测是,在Weblogic上,它不会将队列识别为XA队列。