【问题标题】:JMS - Send message sychronously from message-driven beanJMS - 从消息驱动的 bean 同步发送消息
【发布时间】:2015-08-03 15:41:36
【问题描述】:

我有一个消息驱动的 bean,它从一个队列接收消息,处理它们,然后将消息发送到另一个队列,

onMessage(Message inputMessage) {
    ... Message processing stuff...
    Connection connection = connectionFactory.createConnection();
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    Message outputMessage = session.createObjectMessage();
    outputMessage.setJMSCorrelationID(uniqueId);
    MessageProducer messageProducer = session.createProducer(outputQueue);
    messageProducer.send(outputMessage);
    ... Some more processing...
    QueueBrowser browser;
    browser = session.createBrowser(outputQueue, 
              String.format("JMSCorrelationID='%s'", uniqueId);
}

然后,我检查队列中的 uniqueId,但消息尚未出现在队列中。试验了一下,发现只有在onMessage方法返回后,消息才会出现在输出队列中。

这是一个错误吗?有没有办法立即发送 outputMessage,这样我就可以确定在messageProducer.send(outputMessage) 之后消息确实出现在了 outputQueue 中?

【问题讨论】:

    标签: java ejb jms


    【解决方案1】:

    似乎与这里的情况相反 - JMS rollback

    您希望避免事务行为 - 立即发送与 MDB 事务无关。

    阅读 JavaEE 7 Connection.createSession() 文档,听起来好像没有创建与 MDB 的 JTA 事务分离的会话的好方法。 @schtever 对使用 session.commit() 的回答不起作用的文档 go so far as to say

    如果这一切都是真的,也许可以创建一些额外的方法来执行 JMS 发送调用。将此附加方法设置为事务NOT_SUPPORTEDREQUIRES_NEW

    【讨论】:

      【解决方案2】:

      messageProducer.send(outputMessage);之后发出session.commit();

      【讨论】:

        【解决方案3】:

        在应用程序服务器中运行时,JMS 操作会加入任何全局事务。对此的解决方案是在另一个事务上下文中进行发送。最简单的做法是将发送移动到具有 requires new 事务属性的 EJB 中。

        【讨论】:

          猜你喜欢
          • 2018-02-10
          • 2013-03-17
          • 2012-02-27
          • 1970-01-01
          • 2012-07-21
          • 2017-08-04
          • 2016-03-31
          • 1970-01-01
          • 2018-07-30
          相关资源
          最近更新 更多