为什么Spring JMS在连接到ActiveMQ Broker时每秒都会创建一个JMS连接?

时间:2017-06-21 20:59:20

标签: spring activemq spring-jms

我使用版本4.1.2.RELEASE创建了一个Spring JMS应用程序,该应用程序连接到运行ActiveMQ 5.11.0的代理。我看到的问题如下。在日志中,我注意到每一秒,我都看到如此创建连接。

2017-06-21 13:10:21,046 | level = INFO | thread = ActiveMQ Task-1 | class = org.apache.activemq.transport.failover.FailoverTransport |已成功连接到tcp:// localhost: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?

以下是我在我的应用程序中使用的配置。我希望这是我错误配置的东西,并且会感谢任何人提供的任何见解。

弹簧配置

@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;
}

谢谢,

1 个答案:

答案 0 :(得分:0)

问题确实是以下代码。

factory.setCacheLevel(DefaultMessageListenerContainer.CACHE_NONE);

我删除它的那一刻,快速连接创建停止了。