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

问题描述

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

解决方法

您创建了一个事务会话。在提交事务之前,不会发送JMS消息(否则将无法回滚-消息已到达远程系统)。 当您调用session.close()时,将提交事务。 解决方案是(例如)创建一个非事务会话:
session = conn.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...