MDB onMessage не начинается, пока не закончится ejbTimeout. Разве это не должно начаться асинхронно? - PullRequest
0 голосов
/ 19 апреля 2011

У нас есть 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 Ответ

1 голос
/ 19 апреля 2011

Вы создали транзакционный сеанс.Сообщения JMS не отправляются до тех пор, пока транзакция не будет зафиксирована (иначе откат невозможен - сообщение уже достигло удаленной системы).

Транзакция фиксируется при вызове session.close ().

Решением может быть (например) создание нетранзакционного сеанса:

session = conn.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...