我有一个消息驱动的 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 rollback
您希望避免事务行为 - 立即发送与 MDB 事务无关的内容。
阅读 JavaEE 7 Connection.createSession()文档 听起来好像没有一个好方法来创建与 MDB 的 JTA 事务分离的 session 。文档 go so far as to say @schtever 使用 session.commit() 的答案将不起作用。
如果这一切都是真的,也许可以创建一些额外的方法来执行 JMS 发送调用。将此附加方法设置为事务 NOT_SUPPORTED或者也许REQUIRES_NEW .
关于java - JMS - 从消息驱动 bean 同步发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31791445/