【发布时间】:2017-11-24 22:51:20
【问题描述】:
我使用版本 4.1.2.RELEASE 创建了一个 Spring JMS 应用程序,该应用程序连接到运行 ActiveMQ 5.11.0 的代理。我看到的问题如下。在日志中,我注意到每一秒,我都会看到这样一个连接被创建。
2017-06-21 13:10:21,046 |级别=信息 |线程=ActiveMQ 任务 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;
}
谢谢,
胡安
【问题讨论】:
标签: spring activemq spring-jms