ActiveMQ 死连接问题

ActiveMQ Dead Connection issue

您好,我正在使用 ActiveMQ 5.10.0,它们是幕布进程,它将通过 TCP 连接进行连接并将消息发送到队列以及主题订阅,最大连接总数约为 10000。

由于 activeMQ 中超过了最大连接数,我在一些使用后遇到错误,我通过 activemq 控制台发现很多 TCP 连接仍然存在,活动状态为 true,并且这个连接堆积到 10000,ActiveMQ 抛出错误超过最大连接数。

为什么这个连接永远保持状态为真如何摆脱这个连接有什么办法可以杀死这个死连接或使连接在一段时间后过期。

谢谢..!

每当 JMS 客户端想要连接 MQ 代理时,典型的代码如下:

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
connection = connectionFactory.createConnection();

现在,一旦 JMS 客户端 (producer/consumer) 完成并没有关闭连接,那么 JMS 客户端将仍然与 MQ 代理保持连接并将占用与 MQ 代理的连接。现在,在您的情况下,您的 JMS 客户端代码 "could be faulty" 并没有关闭连接,因此您需要检查您的 JMS 客户端代码并关闭连接,如下所示。

if (connection != null) {
      connection.close();
}

现在,如果您的 JMS 客户端中有消息侦听器,那么预计连接将保持打开状态,但如果这些连接在一段时间后完全不活动,那么您可以 指定使用 wireFormat.maxInactivityDuration 的连接的最大不活动持续时间,为此,当您创建与 MQ 代理的连接时,您应该像这样创建 cf = new ActiveMQConnectionFactory( "tcp://localhost:61616?wireFormat=openwire&wireFormat.maxInactivityDuration=<<whatever_value_you_want>>");

阅读 this ActiveMQ 文档了解更多详情。


作为 FYI - ActiveMQ 代理中的最大连接数是使用其配置文件 activemq.xml 定义的,里面有 transportConnectors 元素,其中您定义了最大连接数 (?maximumConnections=1000),如下所示,因此以防万一,如果您有适当的系统资源并且有能力获得更多客户端连接,那么您可以增加连接数。

<transportConnectors>
            <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>