3

以下に定義するように、Springjmsリスナーを使用しています。通常は正常に動作しますが、recieveTimeout設定に基づいて常に切断および再接続していることがわかります。

<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <!-- mrgm connection to the jca adapter -->
    <property name="connectionFactory" ref="mrgmConnectionFactory" />
    <!-- name of the topic -->
    <property name="destinationName" value="test.destinationname" />
    <!-- class which will listen for messages (must implement javax.jms.MessageListener -->
    <property name="messageListener" ref="TestListener" />
    <property name="sessionTransacted" value="true" />
    <property name="receiveTimeout" value="1000" />
            <!--turning this on drops all messages -->
            <!--        <property name="pubSubDomain" value="true" /> -->

</bean>

私はいくつかのテストを行いましたが、トピックに投稿されているメッセージがたくさんある場合、メッセージが切断から再接続までの短い期間に届くと、リスナーが明らかに見逃してしまうため、メッセージがドロップされます。

recieveTimeoutを0に設定すると、この問題は解消されます。トピックをリッスンするときは、常にrecieveTimeoutを0に設定する必要がありますか?または私はこのプロセス全体を間違った方法で行っていますか?

4

1 に答える 1

0

切断して再接続するときに、サブスクライバーに耐久性がない場合、メッセージが失われる可能性があります。ただし、スプリングDMLCは再接続しないでください。もう少しトラブルシューティングできますか?基本的にトピックをサブスクライブしてからsession.createConsumer(..)ループconsumer.receive()またはconsumer.receive(timeout)。タイムアウトを高く設定すると、DMLCが再接続する理由がわかりません。

ただし、タイムアウトがなくても問題はないはずですが、デバッグログなどを使用して再接続の原因を追跡することをお勧めします。

于 2012-08-25T10:46:04.173 に答える