Java MDB onMessage直到ejbTimeout结束才开始。不应该';它不是异步启动的吗?

Java MDB onMessage直到ejbTimeout结束才开始。不应该';它不是异步启动的吗?,java,weblogic-10.x,message-driven-bean,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 = qC

我们有一个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);

我刚试过这个,没什么区别。我得到的会话是JMXASession,conn是weblogic.deployment.jms.PooledConnection\u weblogic\u jms\u client\u XAConnectionInternalImpl。另外,我在weblogic控制台中看到,连接工厂已选中“XA连接工厂已启用”。因此,您可以通过配置获得事务队列。这种行为很合适。然后将其设置为非事务性,或者在关闭()后停止调试器。