4

Spring 3.0 - DefaultMessageListenerContainer を使用して Websphere 6 MQ に接続しています。MQ にはすでにいくつかのメッセージがあります。テストを実行すると、SessionAwareMessageListener を実装するリスナーが開始されます。しかし、onMessage() は呼び出されません。したがって、問題は、キューに既にあるメッセージが読み取られないことです。

ドキュメントによると、 autoStartup はデフォルトで true です (これは変更していません)。私の理解によると、起動時に、リスナーは既存のメッセージのキューを読み取り、onMessage() を呼び出す必要があります。この理解が間違っていたら教えてください。

構成ファイルのスニペットは次のとおりです。

    <bean id="jmsContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="jmsQueueConnectionFactory" />
        <property name="destinationName">
            <value>${queue}</value>
        </property>
        <property name="messageListener" ref="exampleMessageListener" />
        <property name="concurrentConsumers" value="1" />
        <property name="maxConcurrentConsumers" value="1" />
        <property name="idleTaskExecutionLimit" value="4" />
        <property name="maxMessagesPerTask" value="4" />
        <property name="receiveTimeout" value="5000" />
        <property name="recoveryInterval" value="5000" />
        <property name="sessionTransacted" value="true" />
        <property name="transactionManager" ref="jmsTransActionManager" />
    </bean> 

注: エラーや例外はありません。テスト アプリは問題なく起動します。

これを解決するための指針は非常に役立ちます。

ありがとう、
RJ

4

2 に答える 2

1

問題は解決しました。テストクラスは、リスナーがメッセージを取得した後、メッセージを出力として表示する前に終了していました。そのため、最初のメッセージ (最も優先度の高いメッセージ) がキューから失われていました。

後でトランザクションマネージャーを含めたので、リスナーはメッセージをキューに戻していました(その間にリスナーコンテナが停止しているため、受信メッセージを拒否するという警告が表示されます)。これは警告であり、私のロガーはデバッグ レベルだったので、以前はこれを見逃していました。

テストクラスに thread.sleep を入れると、それがより長い時間実行され、リスナーがキュー内のすべてのメッセージを優先度順に読み取ることができるようになりました:)

乾杯、
RJ

于 2011-11-15T05:22:22.540 に答える
0

これは実際には答えではありませんが、まったく同じ問題に対して新しい質問を作成したくありません。

Spring コンテキストを初期化しました

ctx = new ClassPathXmlApplicationContext("classpath:" + args[0]);

構成を読み取ってから呼び出します (リソースが閉じられていないという警告のため):

ctx.stop();

そして、それが私のBeanを停止させることに気づきませんでした。1日のデバッグの後、ログにこのメッセージが見つかりました

DEBUG o.s.c.s.DefaultLifecycleProcessor - Asking bean 'messageListenerContainer' of type [class org.springframework.jms.listener.DefaultMessageListenerContainer] to stop
于 2014-01-17T12:42:24.103 に答える