質問

Weblogic 10.0.1 の EJB2 (レガシーは最悪です ;-) ステートレス セッション Bean で、Bean 管理のトランザクションを使用して JMS メッセージを受信しようとしています。jmsフォルダーからのキュー定義は次のようになります

<uniform-distributed-queue name="ReqQueue">
  <default-targeting-enabled>true</default-targeting-enabled>
  <delivery-params-overrides>
    <delivery-mode>Non-Persistent</delivery-mode>
  </delivery-params-overrides>
  <quota>QuotaCrc</quota>
  <jndi-name>xxx.ReqQueue</jndi-name>
  <load-balancing-policy>Round-Robin</load-balancing-policy>
</uniform-distributed-queue>
<uniform-distributed-queue name="RespQueue">
  <default-targeting-enabled>true</default-targeting-enabled>
  <delivery-params-overrides>
    <delivery-mode>Non-Persistent</delivery-mode>
  </delivery-params-overrides>
  <quota>QuotaCrc</quota>
  <jndi-name>xxx.RespQueue</jndi-name>
  <load-balancing-policy>Round-Robin</load-balancing-policy>
</uniform-distributed-queue>

Bean 内のビジネス メソッドはトランザクションを開始しないため、JMS 操作はトランザクションではありません。実行されたコードは

InitialContext ictx = new InitialContext();
QueueConnectionFactory cf = (QueueConnectionFactory) 
                       ictx.lookup("weblogic.jms.ConnectionFactory");
Queue responseQueue = (Queue) ictx.lookup("RespQueue");
conn = cf.createConnection();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer receiver = session.createConsumer(responseQueue);
ObjectMessage response = (ObjectMessage) receiver.receive(30000);

問題はそれです receiver.receive キューの内容に関係なく、ブロックせずにただちに null を返します。JMS API ドキュメントによると、 receiver.receive タイムアウトがある場合は、タイムアウト後、または宛先が閉じている場合はすぐに null を返します。Bean 管理トランザクション、コンテナ管理トランザクション、またはトランザクションをまったく使用しない場合でも、問題は同じです。JMS メッセージを別のキューにポストすることは機能します。同じメソッド内で前に送信を行ったかどうかに関係なく、受信はすぐに null を返します。

キューが閉じているのはなぜですか、またはそのように見えるのはなぜですか?

残念ながら、JMS を介して同期呼び出しをトンネリングする必要があるため、MDB はオプションではありません (そして、Ball of Mud であまりふざけたくありません ;-)

役に立ちましたか?

解決

前にMessageConsumer レシーバー = session.createConsumer(responseQueue);置くconn.start();

他のヒント

接続を作成したら、受信者モードに入るために接続を開始する必要があります。これを試して

 ......
 conn = cf.createConnection(); 
 conn.start();
 session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 
 ......
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top