1

以下の設定でアプリケーションにSpring DMLCを使用しています.DMLCで奇妙な動作に直面しています.リスナーキューで1000メッセージを送信すると、〜1990のみがdmlcに非常に迅速に到達し、〜10がサーバーでスタックし、さらに分析するとiこれらの 10 に対して確認応答が返されないことがわかったので、数分後に確認応答が返されますが、非常にゆっくりとサーバー上で確認できます。

これについてさらにcacheConsumers=falseCachingConnectionFactory で試してみましたが、すべてうまくいきましたが、これにより mq サーバーへのバインド/バインド解除が頻繁に行われ、jmv で巨大なコンシューマー オブジェクトが作成されます。この問題を解決する方法はあります cacheConsumers=trueか?

<bean id="listenerContainer"  class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="cachingjmsQueueConnectionFactory" />
    <property name="destination" ref="queueDestination" />
    <property name="messageListener" ref="queueDestination" />
    <property name="concurrency" value="10-10" />
    <property name="cacheLevel" value="1" />
    <property name="transactionManager" ref="dbTransactionManager" />
    <property name="sessionTransacted" value="true" />
</bean>
<bean id="cachingjmsQueueConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="jmsQueueConnectionFactory" />
    <property name="reconnectOnException" value="true" />
    <property name="cacheConsumers" value="true" />
    <property name="cacheProducers" value="true" />
    <property name="sessionCacheSize" value="1" />
</bean>
4

1 に答える 1

2

cachingConnectionFactory で cacheConsumer を false に設定し、DefaultMessageListenerClass で cacheLevel をレベル 3 (CACHE_CONSUMER) に変更することもできます。このようにして、コンシューマーは DMLC レベルでキャッシュされ、頻繁なバインド/アンバインドが発生することなく、スタックしたメッセージの問題が解決されます。

cacheConsumer を false に設定し、DefaultMessageListenerClasse でキャッシングを制御する必要があります。これは、リスナー コンテナーがそのライフサイクル内で適切なキャッシングを処理することが望ましいためです。Spring ドキュメント ( http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/listener/DefaultMessageListenerContainer.html ) の次の注記では、これについて説明しています。

注: Spring の CachingConnectionFactory を動的スケーリングと組み合わせて使用​​しないでください。理想的には、メッセージ リスナー コンテナーと一緒に使用しないでください。一般的には、リスナー コンテナー自体がそのライフサイクル内で適切なキャッシュを処理できるようにすることが望ましいためです。また、リスナー コンテナーの停止と再起動は、ローカルにキャッシュされた独立した接続でのみ機能し、外部にキャッシュされた接続では機能しません。

于 2016-02-16T15:28:01.213 に答える