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&amp;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 禁用不活动监视器。