0

メッセージをMDB のキューに入れるjavax.ejb.TimedObjectがあります...

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 メッセージは非同期で送信されませんか?
  • これは構成の問題でしょうか、それともこれがどのように機能するはずですか?
4

1 に答える 1

1

トランザクション セッションを作成しました。JMS メッセージは、トランザクションがコミットされるまで送信されません (そうでない場合、ロールバックは不可能です。メッセージは既にリモート システムに到達しています)。

session.close() を呼び出すと、トランザクションがコミットされます。

解決策は、(たとえば) 非トランザクション セッションを作成することです。

session = conn.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
于 2011-04-18T23:44:17.313 に答える