4

私のセットアップはSpring 3 JMS、MVC + Websphere MQ + Websphere 7です

<!-- this is the Message Driven POJO (MDP) -->
<bean id="messageListener" class="com.SomeListener" />

<!-- and this is the message listener container -->
<bean id="jmsContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="xxxCF" />
    <property name="destination" ref="someQueue" />
    <property name="messageListener" ref="messageListener" />
</bean>

サーバーを起動すると、キューに入れられたメッセージを受信するため、リスナーは正しく起動しているように見えます。

ただし、JMS とは何の関係もない単純なコントローラー/アクションを実行すると、以下のメッセージが何度も表示されます...

DefaultMessag W org.springframework.jms.listener.DefaultMessageListenerContainer handleListenerSetupFailure Setup of JMS message listener invoker failed for destination 'queue:///ABCDEF.EFF.OUT?persistence=-1' - trying to recover. Cause: MQJMS2008: failed to open MQ queue ''.; nested exception is com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2042'.
DefaultMessag I org.springframework.jms.listener.DefaultMessageListenerContainer refreshConnectionUntilSuccessful Successfully refreshed JMS Connection

ConnectionEve W   J2CA0206W: A connection error occurred.  To help determine the problem, enable the Diagnose Connection Usage option on the Connection Factory or Data Source.

ConnectionEve A   J2CA0056I: The Connection Manager received a fatal connection error from the Resource Adapter for resource JMS$XXXQCF$JMSManagedConnection@2. The exception is: javax.jms.JMSException: MQJMS2008: failed to open MQ queue ''.

ConnectionEve W   J2CA0206W: A connection error occurred.  To help determine the problem, enable the Diagnose Connection Usage option on the Connection Factory or Data Source.

ConnectionEve A   J2CA0056I: The Connection Manager received a fatal connection error from the Resource Adapter for resource jms/XXXQCF. The exception is: javax.jms.JMSException: MQJMS2008: failed to open MQ queue ''.

元のリスナーはまだ正しく動作しているようですが、コントローラーが何らかの形で別の接続をトリガーしていると思いますか? 何をチェックすべきか、またはこの問題の原因を知っている人はいますか?

ありがとう

4

1 に答える 1

3

2042 は「使用中のオブジェクト」を意味します。メッセージ プロデューサのキューを排他的に使用するという概念がないため、コンシューマの 1 つがキューをロックしています。

この動作は、キュー定義の DEFSOPT 属性によって制御されます。これは、管理対象オブジェクトの定義やファクトリ オプションではなく、キュー マネージャー自体にあります。mqm (または、QMgr が Windows、iSeries、z/OS などにある場合は同等のプラットフォーム) としてサインオンしているときにコマンド行から、runmqsc を開始し、次のコマンドを発行して問題を確認してから修正する必要があります。私の例では、QMgr は PLUTO で、例のキューは SYSTEM.DEFAULT.LOCAL.QUEUE です。

/home/mqm: runmqsc PLUTO
5724-H72 (C) Copyright IBM Corp. 1994, 2009.  ALL RIGHTS RESERVED.
Starting MQSC for queue manager PLUTO.

dis q(system.default.local.queue) defsopt
     1 : dis q(system.default.local.queue) defsopt
AMQ8409: Display Queue details.
   QUEUE(SYSTEM.DEFAULT.LOCAL.QUEUE)       TYPE(QLOCAL)
   DEFSOPT(EXCL)
alter ql(system.default.local.queue) defsopt(shared)
     2 : alter ql(system.default.local.queue) defsopt(shared)
AMQ8008: WebSphere MQ queue changed.
dis q(system.default.local.queue) defsopt
     3 : dis q(system.default.local.queue) defsopt
AMQ8409: Display Queue details.
   QUEUE(SYSTEM.DEFAULT.LOCAL.QUEUE)       TYPE(QLOCAL)
   DEFSOPT(SHARED)

キューを表示して、すでに DEFSOPT(SHARED) に設定されていることがわかった場合は、何かが API を介してキューの排他的使用を指定している必要があります。これらの非 JMS API は低レベルの WMQ 機能にアクセスできるため、これは通常、C または基本 Java プログラムを意味します。これらは診断が少し難しい場合があり、通常はトレースまたはSupportPac MA0W出口を使用して、使用されている API 呼び出しとオプションを表示します。この場合、元の投稿で述べたように、「単純なコントローラー/アクション」の意味について詳しく知りたいと思います。

最後に、アクセスしているキューがリモート キューである場合は、送信キューに解決されます。チャネルは常に送信キューを GET(INHIBITED) に設定し、排他ロックを取得します。これは、アプリケーションがローカル キューからのみメッセージを取得できるという点で、WMQ 機能と一致しています。

于 2011-02-14T23:20:13.073 に答える