gpt4 book ai didi

java - MDB onMessage 在 ejbTimeout 结束之前不会开始。不应该异步启动吗?

转载 作者:行者123 更新时间:2023-12-01 15:52:38 24 4
gpt4 key购买 nike

我们有一个javax.ejb.TimedObject,它将消息排队到MDB,如下所示......

ctx = new InitialContext();
QueueConnectionFactory qCF = (QueueConnectionFactory) ctx
.lookup("java:comp/env/jms/queueconnfactory");
Queue q = (Queue) ctx.lookup("java:comp/env/jms/queue");
conn = qCF.createQueueConnection();
session = conn.createQueueSession(true,
Session.AUTO_ACKNOWLEDGE);
QueueSender sender = session.createSender(q);
TextMessage txtMsg = session.createTextMessage();
txtMsg.setLongProperty(JobMonitorUtil.JOB_REFERENCE_ID, filingId);
txtMsg.setLongProperty(JobMonitorUtil.JOB_ID, jobId);
txtMsg.setLongProperty(JobMonitorUtil.JOB_RUN_SID, jobRunSId);
sender.send(txtMsg);
session.close();
conn.close();

当我调试这个(在 Weblogic 10.3.1.0 上)时,我跨过 sender.sent(txtMsg) 行,我希望我的 onMessage 断点几乎立即被命中。直到我让 ejbTimeout 运行(实际上是当我退出 TimerImpl.timerExpired 时),它才会到达断点。消息队列位于生成消息的同一服务器上。

对我来说这似乎很奇怪。

  • MDB 消息不是异步发送的吗?
  • 这可能是配置问题还是它本来就是这样工作的?

最佳答案

您创建了一个事务 session 。在事务提交之前,JMS 消息不会发送出去(否则无法回滚——消息已经到达远程系统)。

当您调用 session.close() 时,事务将被提交。

解决方案是(例如)创建一个非事务性 session :

session = conn.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);

关于java - MDB onMessage 在 ejbTimeout 结束之前不会开始。不应该异步启动吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5709711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com