Weblogic10 EJB2 セッション Bean の JMS キューは送信できるが受信できない
-
16-09-2019 - |
質問
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);
......