慢速网络丢弃大消息
注意
本文仅适用于旧版本的 ActiveMQ Classic,即 5.3 和 5.4.0。从 5.4.2 开始,此问题已在以下错误中得到解决:AMQ-2511 和 AMQ-2088.
您可能会在使用慢速链路跨网络发送大消息时遇到问题。
症状通常是网络连接断开并不断重新建立。
此问题出现的原因是 ActiveMQ Classic 消息代理会不断检查套接字上的活动,并在 TCP 套接字缓冲区中构建大消息时,空闲监视器 会超时 - 请参阅 配置线格式 和 TCP 传输参考.
空闲监视器 使用一个活动标志,该标志仅在收到消息后更新(以防连接未处于空闲状态)。
然后监视器清除活动标志,等待超时时间并查看活动标志。如果它仍然被清除,那么我们假设连接处于非活动状态。当连接未被使用时,会发送一个保持活动消息。但是,如果连接正在使用中,因为正在发送/接收较大消息,则不会发送保持活动消息,并且不会更新活动标志。这会导致空闲超时。
理想情况下,活动标志应该在每次从网络接收几个字节时被清除……但现在它只在组装整个消息时被清除。
您可以将 wireFormat.maxInactivityDuration 属性设置为较高的值 - 或者禁用它(将其设置为零)以解决此问题。
例如,像这样配置您的网络连接
<?xml version=”1.0” encoding=”UTF-8”?>