我創建了一個使用版本4.1.2.RELEASE的Spring JMS應用程序,該應用程序連接到運行ActiveMQ 5.11.0的代理。我看到的問題如下。在日誌中,我注意到每秒都會看到一個連接被創建爲這樣。爲什麼Spring JMS在連接到ActiveMQ Broker時每秒創建一個JMS連接?
2017-06-21 13:10:21,046 | level = INFO | thread = ActiveMQ Task-1 | class = org.apache.activemq.transport.failover.FailoverTransport |成功連接到TCP://本地主機:61616
我知道這是每次創建一個新的ActiveMQ連接,因爲它成功地表示,「連接」,而不是「重新連接」,如圖位於這裏的代碼:http://grepcode.com/file/repo1.maven.org/maven2/com.ning/metrics.collector/1.3.3/org/apache/activemq/transport/failover/FailoverTransport.java#891
我沒有爲我的客戶設置緩存連接工廠,但我想知道是否以下是罪魁禍首,因爲我看到爲什麼我看到了不斷創建的連接。
factory.setCacheLevel(DefaultMessageListenerContainer.CACHE_NONE);
以下文章指出消費者不應該被緩存,但我想知道是否適用於緩存連接+會話。如果連接被緩存,但會話不是,那麼我想知道是否會產生問題。
Why DefaultMessageListenerContainer should not use CachingConnectionFactory?
下面是我用我的應用程序的配置。我希望這是我錯誤配置的東西,並希望任何人都能提供的見解。
Spring的配置文件
@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;
}
感謝,
胡安