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&amp;wireFormat.maxInactivityDurationInitalDelay=10000"/>
</transportConnectors>

如果 maxInactivityDuration和 maxInactivityDurationInitalDelay在同一连接的两端设置为不同的值会发生什么?

在启动时,InactivityMonitor 会协商合适的 maxInactivityDuration和 maxInactivityDurationInitalDelay。连接将使用最短的持续时间。

可以禁用连接上的 InactivityMonitor 吗?

将 transport.useInactivityMonitor=false设置为 false 将禁用 InactivityMonitor。配置 wireFormat.maxInactivityDuration=0将达到相同的效果。

潜在问题

slow-networks-drop-large-messages

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛标志和 Apache ActiveMQ 项目标志是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 许可。