繁体   English   中英

JMS-从消息驱动的bean同步发送消息

[英]JMS - Send message sychronously from message-driven bean

我有一个消息驱动的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中?

似乎是这种情况的另一面-JMS回滚

您想避免事务行为-立即发送与MDB事务无关的消息。

阅读JavaEE 7 Connection.createSession()文档,听起来好像没有一种好方法来创建与MDB的JTA事务分离的会话。 文档甚至说 @schtever使用session.commit()的答案将不起作用。

如果所有这些都是正确的,则可以创建一些其他方法来执行JMS发送调用。 将此附加方法设置为事务NOT_SUPPORTED或也许为REQUIRES_NEW

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

在应用服务器中运行时,JMS操作会参与任何全局事务。 解决方案是在另一个事务上下文中进行发送。 最简单的操作是将发送到事务属性为require new的EJB中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM