3

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

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

这称为“同步接收”

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

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

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

作为旁注,这是一个在 weblogic 环境中正常工作的 EJB,并且消息确实会在应该发送的时候发送,而不是在事务结束时发送。

谢谢你的帮助。

4

2 回答 2

1

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

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

于 2009-06-22T09:35:47.487 回答
0

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

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

于 2009-11-05T16:10:05.003 回答