【发布时间】:2021-07-24 06:09:15
【问题描述】:
我们在环境中观察到 ActiveMQ UI 中的消费者被删除。我们的流量非常低,并且观察到最初我们有 3 个消费者,并且在间隔几个小时后将每个消费者都删除了,一旦我们重新启动消费者,它会再次刷新连接几个小时,我们在日志中看不到任何错误,除了:
Setup of JMS message listener invoker failed for destination 'queue-1' - trying to recover. Cause: The Consumer is closed
我使用 AWS ActiveMQ 代理,但在代理日志中看不到任何错误。
我们按照推荐使用PoolConnectionFactory 和ActiveMQConnectionFactory 为我们的消费者创建连接池。我们正在使用 ActiveMQ 5.15
@Bean
public PooledConnectionFactory pooledConnectionFactory() {
ActiveMQConnectionFactory activeMQConnectionFactory =
new ActiveMQConnectionFactory();
activeMQConnectionFactory.setBrokerURL(brokerUrl);
activeMQConnectionFactory.setUserName(username);
activeMQConnectionFactory.setPassword(password);
activeMQConnectionFactory.setTrustAllPackages(true);
ActiveMQPrefetchPolicy activeMQPrefetchPolicy = new ActiveMQPrefetchPolicy();
activeMQPrefetchPolicy.setQueuePrefetch(100);
//activeMQPrefetchPolicy.setQueuePrefetch();
activeMQConnectionFactory.setPrefetchPolicy(activeMQPrefetchPolicy);
PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory(activeMQConnectionFactory);
pooledConnectionFactory.setMaxConnections(poolSize);
return pooledConnectionFactory;
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(pooledConnectionFactory());
factory.setMessageConverter(jacksonJmsMessageConverter());
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
factory.setConcurrency("1-1");
factory.setErrorHandler(ActiveMQErrorHandler());
return factory;
}
@Bean
public JmsTemplate jmsTemplate() {
JmsTemplate jmsTemplate = new JmsTemplate(pooledConnectionFactory());
jmsTemplate.setMessageConverter(jacksonJmsMessageConverter());
return jmsTemplate;
}
@Bean
public Queue queue() {
return new ActiveMQQueue(queueName);
}
@Bean
public ErrorHandler ActiveMQErrorHandler() {
return t -> {
LOGGER.error("JMS_LISTENER_ERROR");
};
}
【问题讨论】:
-
@JustinBertram 我使用 aws 活动 mq 代理,但在代理中看不到任何错误,在 ActiveMQHandler 中只是记录日志,在日志中看不到打印相同的内容
@Bean public ErrorHandler ActiveMQErrorHandler() {return t ->{ LOGGER.error("JMS_LISTENER_ERROR");}; } -
我们需要让消费者连接,即使有流量或没有流量,我们尝试了更高值的 idletimeout 但这也没有帮助
-
是否有网络设备(例如防火墙)正在关闭空闲连接?
-
@JustinBertram 我不这么认为,因为 3 个消费者在 24 小时后只运行了 2 个,即使没有流量,过去 3 天仍有 1 个消费者在运行,是否有我缺少的配置在活动 mq 消费者设置中以确保消费者始终连接到代理?
-
您用于创建池连接的连接 URI 是什么?
标签: activemq spring-jms