ActiveMQ Classic InactivityMonitor
使用 ActiveMQ Classic > 配置传输 > ActiveMQ Classic InactivityMonitor
ActiveMQ Classic InactivityMonitor
ActiveMQ Classic InactivityMonitor 是一个活动线程,用于检查连接是否仍然处于活动状态。如果它怀疑连接无法正常工作,则会关闭连接。
连接通过以下方式进行监控:
- 确保在指定的时间段内(最大不活动持续时间)从连接中读取数据。
- 如果在指定的时间段内没有在连接上发送任何**正常**的 activemq 流量,则将
KeepAliveInfo
消息写入连接。
每个连接都有两个关联的 InactivityMonitor,分别位于连接的两端。InactivityMonitor 预计在指定的时间段内在连接上接收数据。如果在该时间段内没有在连接上发送**正常**的 ActiveMQ Classic 流量,则它期望收到来自连接另一端 InactivityMonitor 发送的 KeepAliveInfo
消息。
使用默认值;如果在 30 秒内没有从连接中写入或读取数据,则 InactivityMonitor 将启动。InactivityMonitor 会抛出一个 InactivityIOException
,并关闭与连接相关的传输。这将导致以下 DEBUG
日志记录
2012-06-26 17:13:55,712 | DEBUG | 30000 ms elapsed since last read check. | org.apache.activemq.transport.AbstractInactivityMonitor | InactivityMonitor ReadCheck
2012-06-26 17:13:55,712 | DEBUG | No message received since last read check for tcp:///127.0.0.1:52659! Throwing InactivityIOException. | org.apache.activemq.transport.AbstractInactivityMonitor | InactivityMonitor ReadCheck
2012-06-26 17:13:55,714 | DEBUG | Transport Connection to: tcp://127.0.0.1:52659 failed:
org.apache.activemq.transport.InactivityIOException: Channel was inactive for too (>30000) long: tcp://127.0.0.1:52659 |
org.apache.activemq.broker.TransportConnection.Transport | InactivityMonitor Async Task:
java.util.concurrent.ThreadPoolExecutor$Worker@6a346239
org.apache.activemq.transport.InactivityIOException: Channel was inactive for too (>30000) long: tcp://127.0.0.1:52659
at org.apache.activemq.transport.AbstractInactivityMonitor$4.run(AbstractInactivityMonitor.java:187)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
高级 InactivityMonitor 配置
有一些配置选项可以进一步微调 InactivityMonitor
。注意,对于大多数用例来说,默认值就可以了。
参数 | 默认值 | 描述 |
---|---|---|
wireFormat.maxInactivityDuration |
30000 |
超时时间(以毫秒为单位),如果在该时间段内没有收到数据,则连接将被代理关闭。 |
wireFormat.maxInactivityDurationInitalDelay |
10000 |
指定连接不活动监控启动前的最大延迟(以毫秒为单位)。如果代理正在承受负载,并且同时创建了许多连接,这将非常有用。 |
transport.useInactivityMonitor |
true |
如果值为 false ,则完全禁用 InactivityMonitor ,并且连接永远不会超时。 |
transport.useKeepAlive |
true |
确定是否应该在空闲连接上发送 KeepAliveInfo 消息以防止其超时。禁用保持活动状态仍然会导致连接在指定的时间段内没有收到任何数据时超时。 |
这些参数可以直接在客户端连接 URL 上指定,例如 tcp://127.0.0.1:61616?wireFormat.maxInactivityDuration=30000
,**或者在代理的传输连接器 URL 上指定**
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?wireFormat.maxInactivityDuration=30000&wireFormat.maxInactivityDurationInitalDelay=10000"/>
</transportConnectors>
如果 maxInactivityDuration
和 maxInactivityDurationInitalDelay
在同一连接的两端设置为不同的值会发生什么?
在启动时,InactivityMonitor 会协商合适的 maxInactivityDuration
和 maxInactivityDurationInitalDelay
。连接将使用最短的持续时间。
可以禁用连接上的 InactivityMonitor 吗?
将 transport.useInactivityMonitor=false
设置为 false 将禁用 InactivityMonitor。配置 wireFormat.maxInactivityDuration=0
将达到相同的效果。