2017-06-21 67 views
0

我創建了一個使用版本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; 
} 

感謝,

胡安

回答

0

問題確實是下面的代碼。

factory.setCacheLevel(DefaultMessageListenerContainer.CACHE_NONE); 

當我移除它時,快速連接創建停止。