【问题标题】:ActiveMQ Dead Connection issueActiveMQ 死连接问题
【发布时间】:2017-09-15 03:53:38
【问题描述】:

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

由于activeMQ中超过最大连接数而导致一些使用面临错误后,我通过activemq控制台发现许多TCP连接仍然处于活动状态,活动状态为true,此连接堆积到10000,ActiveMQ抛出错误为最大值已超出连接。

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

谢谢你..!

【问题讨论】:

    标签: apache tcp connection activemq wso2esb


    【解决方案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>>");

    阅读thisActiveMQ 文档了解更多详情。


    仅供参考 - 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>
    

    【讨论】:

    • 嗨@hagrawal,谢谢你的重播,正如你所说,我已经用我的代码检查了所有连接都关闭了 connection.close(); , case1 : 实际上,当用户通过 tcp 连接在网络上登录时,它并没有像用户注销或会话到期时那样关闭。
    • 案例 2:当将消息放入队列时,最终用户的 Internet 连接受到干扰,并且 MQ 无法向所使用的请求发送 ack,因此连接保持不变。可以在 activemq.xml 中进行任何更改,在一段时间后关闭连接。
    • 对于您的情况 1:正如您所提到的,显然问题是当用户注销或会话到期时,您必须关闭连接。对于案例 2:就像我说的那样,您可以指定最大不活动持续时间,也可以以类似的方式超时参数,请阅读此处 - activemq.apache.org/tcp-transport-reference.html 。看看你的情况,我认为你应该配置慢消费者,在这里阅读 - planet.jboss.org/post/…
    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 2011-08-20
    • 2012-05-09
    • 2022-10-21
    • 2020-10-24
    • 1970-01-01
    • 2012-12-22
    • 2018-08-08
    相关资源
    最近更新 更多