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

标签 java ejb jms

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

相关文章:

java - Eclipse IAutoEditStrategy 仅在退格时调用;如何让它调用所有编辑?

java - JPA2——如何自动删除 `many`一侧的单向多对一映射数据?

java - 拦截器不是从同一 EJB 中的另一个 EJB 方法触发的

jms - 在一笔事务中发送多条 jms 消息

java - 有没有办法在 Jooq 中通过示例查询?

java - 如何使用apache文件 uploader 在google app engine java中获取文件大小

java - Java 中的目录监听器

java - 尝试运行客户端时出现 EJB 异常

java - Spring 集成

jakarta-ee - JAAS 身份验证在 JMS 中使用 WildFly : javax. jms.JMSSecurityException:HQ119032:用户:null 没有权限 = 在地址 {2} 上发送