直到ejbTimeout结束,MDB onMessage才会开始。它不应该异步启动吗?

时间:2011-04-18 22:41:39

标签: java weblogic-10.x message-driven-bean

我们有一个 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消息吗?
  • 这可能是配置问题,还是它应该如何工作?

1 个答案:

答案 0 :(得分:1)

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

调用session.close()时会提交事务。

解决方案是(例如)创建非事务性会话:

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