代码之家  ›  专栏  ›  技术社区  ›  Eldelshell

JBoss不发送JmsTemplate(Spring)消息

  •  2
  • Eldelshell  · 技术社区  · 15 年前

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

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

    这称为“同步接收”

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

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

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

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

    谢谢你的帮助。

    2 回复  |  直到 15 年前
        1
  •  1
  •   skaffman    15 年前

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

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

        2
  •  0
  •   Jason Gritman    15 年前

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

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