在我的团队中,我们在生产中使用ActiveMQ 5.15.11,我们的消息消费者通过HTTP协议连接。由于我们在消费者端存在网络问题,我们尝试禁用activemq.xml中的InactivityMonitor(见下文(
<transportConnectors>
<transportConnector name="openwire" uri="tcp://host:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="http" uri="http://host:61617?wireFormat.maxInactivityDuration=0"/>
</transportConnectors>
似乎没有应用">wireFormat.maxInactivityDuration=0",因为我们在消费者中有来自InactivityMonitor的日志:
2020-03-18 00:00:03,426 [DEBUG] - - - WriteChecker: 10000ms elapsed since last write check.
2020-03-18 00:00:03,426 [DEBUG] - - - Running WriteCheck[https://host:443/activemq]
2020-03-18 00:00:03,509 [DEBUG] - - - WriteChecker: 10000ms elapsed since last write check.
2020-03-18 00:00:03,509 [DEBUG] - - - Running WriteCheck[https://host:443/activemq]
2020-03-18 00:00:03,514 [DEBUG] - - - WriteChecker: 10000ms elapsed since last write check.
2020-03-18 00:00:03,514 [DEBUG] - - - Running WriteCheck[https://host:443/activemq]
2020-03-18 00:00:03,642 [DEBUG] - - - WriteChecker: 10000ms elapsed since last write check.
2020-03-18 00:00:03,642 [DEBUG] - - - Running WriteCheck[https://host:443/activemq]
2020-03-18 00:00:03,706 [DEBUG] - - - WriteChecker: 10000ms elapsed since last write check.
2020-03-18 00:00:03,706 [DEBUG] - - - Running WriteCheck[https://host:443/activemq]
2020-03-18 00:00:03,738 [DEBUG] - - - WriteChecker: 10000ms elapsed since last write check.
2020-03-18 00:00:03,738 [DEBUG] - - - Running WriteCheck[https://host:443/activemq]
此外,一旦我们得到长时间的网络延迟,我们也会得到日志:
2020-03-01 20:43:17,578 [WARN ] - - - Transport (https://host:443/activemq) failed , attempting to automatically reconnect: {}
org.apache.activemq.transport.InactivityIOException: Channel was inactive for too (>30000) long: https://host:443/activemq
at org.apache.activemq.transport.AbstractInactivityMonitor$5.run(AbstractInactivityMonitor.java:246)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
注意1:ActiveMQ客户端是JMS使用者。
注意2:我们试图在TCP传输上禁用InactivityMonitor,它与此协议配合良好。
感谢您提前提供的帮助。
对于HTTP传输,我不认为执行了标准的OpenWire协议协商步骤,这可能意味着在客户端可以看到最大不活动持续时间的服务器端配置。这导致客户端使用非活动检查的默认值,我记得大约是30秒,然后将其分成更小的块进行读写检查。
您可能需要将客户端配置为不使用相同的线格式选项进行检查。不过,我认为这些都没有经过广泛的测试,所以在更改HTTP传输包装器的默认值时可能会出现问题。如果它继续行为不端,那么您可能需要使用ActiveMQ项目打开一个JIRA来实现一些东西,以便更好地控制它。
在客户端,您应该能够在URI上使用transport.useInactivityMonitor=false
或仅使用useInactivityMonitor=false
禁用非活动监视器。