JBoss没有发送JmsTemplate(Spring)消息。

3
实际上,JBoss确实发送了消息,但仅在EJB启动的当前事务完成时发送。
我们在JBoss 4.0.3和Spring的JmsTemplate中遇到了这个问题。一个EJB向一个队列发送一条消息,其中包含一个临时队列作为回复字段。然后,在同一个事务内,我们监听第一个MDB给出的响应。问题是JmsTemplate的"send"方法在事务结束后才执行。因此,当消息被发送到队列并由MDB处理时,临时队列的侦听器已经消失了。
这称为"同步接收"。
两件事改变了这种行为,但引起了一些关注:
1.将EJB的事务类型更改为BMT。(关注:BMT很糟糕) 2.创建一个线程,它所做的就是调用JmsTemplate.send()方法。
顺便说一下,这是一个在weblogic环境下正常工作的EJB,并且消息在应该发送的时间发送,即在事务进行中而不是事务结束时。
感谢任何帮助。

这种行为在我测试过的每个 JBoss 版本上都是相同的:4.2、5.0 和 5.1。 - Eldelshell
2个回答

1

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

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


“发送操作应该只在事务提交时执行”,但这将不允许任何可能使用同步接收的情况。 - Eldelshell
在事务的上下文中,是的。但如果你可以说服JmsTemplate在该上下文之外执行,那么你应该没问题。或者,不要使用JMSTemplate——它只是JMS API的包装器。 - skaffman
我将您的答案标记为“正确答案”,因为它让我朝着正确的方向前进。为了不使用当前事务上下文,我使用了问题中描述的第二个选项。 - Eldelshell

0

您可以将JMS模板包装在代码中,使用Spring的事务管理,将其放入无状态会话bean或服务方法中,并使用REQUIRES_NEW的事务传播。这样,消息的发送就在自己的事务中,该事务将提交消息的发送,超出了包装事务的范围。

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


谢谢Jason,我会查看这个解决方案并查看是否按预期工作。 - Eldelshell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接