【发布时间】:2021-05-27 09:30:29
【问题描述】:
在向 ActiveMQ Artemis 代理 2.17.0 发送消息时,我试图在我的生产者上引入超时。为此,我使用以下代码
@Bean
public ConnectionFactory jmsConnectionFactoryOnline() {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUrl,username,password);
connectionFactory.setCallTimeout(5000);
return connectionFactory;
}
@Bean
public JmsPoolConnectionFactory pooledConnectionFactory() {
JmsPoolConnectionFactory poolingFactory = new JmsPoolConnectionFactory();
poolingFactory.setConnectionFactory(jmsConnectionFactoryOnline());
poolingFactory.setMaxConnections(MAX_CONNECTIONS);
poolingFactory.setMaxSessionsPerConnection(MAX_SESSIONS_PER_CONNECTION);
poolingFactory.setConnectionIdleTimeout(0);
return poolingFactory;
}
当我使用 iptables -A INPUT -s ip_producer -j DROP 在 ActiveMQ Artemis 节点上模拟丢失网络时,我可以在生产者端看到当前连接遵守最初设置的 5 秒超时。
不幸的是,后续请求(新连接)似乎忽略了它,因为我可以观察到生产者在声明请求中断之前等待下一次调用直到连接超时间隔(60 秒)。
你能指导我如何解决这个问题,或者指出我做错了什么并且我无法为我的制作人设置超时吗?
【问题讨论】:
-
您是否有任何线程转储显示新连接在何处等待 60 秒?这听起来像是一个可能的错误,或者可能是代码位于调用超时不适用的区域。
-
实际上,我想澄清一下 callTimeout 是否也与获取连接有关,因为它第一次失败
Timed out after waiting 5,000 ms for response when sending packet 45 [code=CONNECTION_TIMEDOUT]然后我想它不再与代理建立连接(或者代理关闭它) .然后第二次调用它,因为我现在可以理解它尝试获取一个新的并且它在连接超时设置到期后失败,而不是像我在 ConnectionFactory callTimeout 上设置的那样在 5 秒后立即失败(仍然没有可用的网络)。这是一个正确的假设吗? -
这也是我试图澄清的,这就是我要求线程转储的原因。我想确切地看到代码在哪里等待,这样我就可以查看代码并确定调用超时是否适用于那里。如果没有这样的细节,就很难最终回答您的问题。
-
另外,代理不会关闭连接,因为客户端的调用超时。代理不知道也不关心此类客户端超时。但是,Spring 可能会在收到超时生成的异常时自行关闭连接。
-
贾斯汀感谢您的回复,我会尽快提取一些日志,希望对您有所帮助
标签: activemq-artemis