ActiveMQ InactivityMonitor 参数未应用于 HTTP 传输连接
ActiveMQ InactivityMonitor params not applied on HTTP Transport connection
在我的团队中,我们在生产中使用 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.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:我们尝试禁用 InactivityMonitor on TCP transport 并且它适用于此协议。
提前感谢您的帮助。
对于 HTTP 传输,我认为没有执行标准的 OpenWire 协议协商步骤,这可能意味着服务器端的 max-inactivity-duration 配置在客户端可见。这导致客户端使用默认值进行不活动检查,我记得是 30 秒左右,然后它分成更小的块进行读写检查。
您可能需要将客户端配置为不使用相同的线格式选项进行检查。我不认为其中任何一个都经过广泛测试,因此可能存在通过 HTTP 传输包装器更改默认值的问题。如果它继续不正常,那么您可能需要打开一个带有 ActiveMQ 项目的 JIRA 来实现一些东西,让您更好地控制它。
在客户端,您应该能够使用 transport.useInactivityMonitor=false
或 URI 上的 useInactivityMonitor=false
禁用不活动监视器。
在我的团队中,我们在生产中使用 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.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:我们尝试禁用 InactivityMonitor on TCP transport 并且它适用于此协议。
提前感谢您的帮助。
对于 HTTP 传输,我认为没有执行标准的 OpenWire 协议协商步骤,这可能意味着服务器端的 max-inactivity-duration 配置在客户端可见。这导致客户端使用默认值进行不活动检查,我记得是 30 秒左右,然后它分成更小的块进行读写检查。
您可能需要将客户端配置为不使用相同的线格式选项进行检查。我不认为其中任何一个都经过广泛测试,因此可能存在通过 HTTP 传输包装器更改默认值的问题。如果它继续不正常,那么您可能需要打开一个带有 ActiveMQ 项目的 JIRA 来实现一些东西,让您更好地控制它。
在客户端,您应该能够使用 transport.useInactivityMonitor=false
或 URI 上的 useInactivityMonitor=false
禁用不活动监视器。