ActiveMQ死连接问题

时间:2017-04-19 05:13:01

标签: apache tcp connection activemq wso2esb

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

在一些用法使用后面临错误,因为在activeMQ中超出了最大连接数,我已经通过activemq控制台,发现很多TCP连接仍处于活动状态,且活动状态为true,此连接堆积为10000,ActiveMQ引发错误为最大值连接超出。

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

谢谢..!

1 个答案:

答案 0 :(得分:1)

每当JMS客户端想要与MQ代理连接时,典型代码就是这样:

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

现在,一旦JMS客户端(生产者/消费者)完成,如果它没有关闭连接,则该JMS客户端仍将与MQ代理保持连接,并将占用与MQ代理的连接。现在,在您的情况下看起来像您的JMS客户端代码"可能有问题"而不是关闭连接,所以你需要检查你的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.xml定义ActiveMQ代理中的最大连接数,在其中您已定义最大连接的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>