【问题标题】:Why is Spring JMS creating a JMS connection every second when connecting to an ActiveMQ Broker?为什么 Spring JMS 在连接到 ActiveMQ 代理时每秒都会创建一个 JMS 连接?
【发布时间】: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


    【解决方案1】:

    问题确实是下面的代码。

    factory.setCacheLevel(DefaultMessageListenerContainer.CACHE_NONE);
    

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

    【讨论】:

      猜你喜欢
      • 2015-02-03
      • 2015-09-12
      • 2014-04-17
      • 1970-01-01
      • 2020-02-24
      • 2013-01-28
      • 2017-05-14
      • 2015-11-21
      • 2019-01-06
      相关资源
      最近更新 更多