2017-06-21 31 views
0

バージョン4.1.2.RELEASEを使用してSpring JMSアプリケーションを作成しました。このアプリケーションは、ActiveMQ 5.11.0を実行しているブローカに接続されています。私が見ている問題は以下の通りです。ログでは、毎秒、接続が作成されているのがわかります。なぜ、ActiveMQブローカに接続すると毎秒Spring JMSがJMS接続を作成するのですか?

2017-06-21 13:10:21,046 |レベル= INFO |スレッド= ActiveMQタスク-1 |クラス= org.apache.activemq.transport.failover.FailoverTransport | http://grepcode.com/file/repo1.maven.org/maven2/com.ning/metrics.collector/1.3.3/org/apache/activemq/transport/failover/FailoverTransport.java#891

:私はそれがここにあるコードに示すように「再接続」が正常に言うので、「接続」、新ActiveMQの接続を毎回作成していないことを知っている61616

:// localhostを:正常にTCPに接続

私の消費者向けにキャッシュ接続ファクトリが設定されていませんが、なぜ定数接続が作成されているのかについては、次の原因が考えられますか?

factory.setCacheLevel(DefaultMessageListenerContainer.CACHE_NONE); 

次の記事では、コンシューマをキャッシュするべきではありませんが、接続+セッションのキャッシュに適用されるかどうかは疑問です。接続がキャッシュされていてもセッションがキャッシュされていない場合、問題が発生するかどうかは疑問です。

Why DefaultMessageListenerContainer should not use CachingConnectionFactory?

次私は自分のアプリケーションで使用している構成です。私はそれが私が誤って構成したものであり、誰もが提供しなければならない洞察を感謝してくれることを願っています。

春の構成

@Bean 
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() throws Throwable { 
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); 
     factory.setConnectionFactory(connectionFactory()); 

     factory.setCacheLevel(DefaultMessageListenerContainer.CACHE_NONE); 
     factory.setMaxMessagesPerTask(-1); 
     factory.setConcurrency(1); 
     factory.setSessionTransacted(true); 
     return factory; 
} 

@Bean 
public CachingConnectionFactory cachingConnectionFactory(){ 
CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(connectionFactory()); 
cachingConnectionFactory.setCacheConsumers(false); 
cachingConnectionFactory.setSessionCacheSize(1); 
return cachingConnectionFactory; 
} 

@Bean 
public ActiveMQConnectionFactory connectionFactory(){ 
RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy(); 
redeliveryPolicy.setInitialRedeliveryDelay(1000L); 
redeliveryPolicy.setRedeliveryDelay(1000L); 
redeliveryPolicy.setMaximumRedeliveries(6); 
redeliveryPolicy.setUseExponentialBackOff(true); 
redeliveryPolicy.setBackOffMultiplier(5); 
    ActiveMQConnectionFactory activeMQ = new ActiveMQConnectionFactory("admin", "admin", "tcp://localhost:61616"); 
activeMQ.setRedeliveryPolicy(redeliveryPolicy); 
activeMQ.setPrefetchPolicy(prefetchPolicy()); 
return activeMQ; 
} 

@Bean 
public JmsMessagingTemplate jmsMessagingTemplate(){ 
ActiveMQTopic activeMQ = new ActiveMQTopic("topic.out"); 
JmsMessagingTemplate jmsMessagingTemplate = new JmsMessagingTemplate(cachingConnectionFactory()); 
jmsMessagingTemplate.setDefaultDestination(activeMQ); 
return jmsMessagingTemplate; 
} 

protected ActiveMQPrefetchPolicy prefetchPolicy(){ 
ActiveMQPrefetchPolicy prefetchPolicy = new ActiveMQPrefetchPolicy(); 
int prefetchValue = 1000; 
prefetchPolicy.setQueuePrefetch(prefetchValue); 
return prefetchPolicy; 
} 

おかげで、

フアン

答えて

0

問題は確かに次のコードでした。

factory.setCacheLevel(DefaultMessageListenerContainer.CACHE_NONE); 

削除した瞬間、高速接続の作成が停止しました。

関連する問題