WSO2 rabbitMQ - 创建但未关闭的通道 - 内存泄漏问题

Posted

技术标签:

【中文标题】WSO2 rabbitMQ - 创建但未关闭的通道 - 内存泄漏问题【英文标题】:WSO2 rabbitMQ - channels created and not closed - memory leak problem 【发布时间】:2019-10-07 14:15:21 【问题描述】:

我在 RabbitMQ 中使用 WSO2 ESB,我有一个代理服务和一个序列。

代理服务作为 RabbitMQ 队列的消费者(通过 rabbitmq 传输),消费的消息被发送到 HTTP 端点。

序列作为生产者在队列中添加动作,调用端点。

我还有一个 API,每次调用都会插入队列中。一切正常,但每次调用 API 时,rabbit 队列中都会创建许多通道而不关闭它们,从而导致 Rabbit 服务器机器上出现“内存泄漏”问题。

我们尝试创建“直接”和“扇出”交换,但没有解决内存泄漏问题。

序列代码下方:

<sequence name="add-insertqueue-tostore" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <property name="FORCE_SC_ACCEPTED" scope="axis2" type="STRING" value="true"/>
    <property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
    <call>
        <endpoint key="gov:endpoints/rabbit/insert-toqueue.xml"/>
    </call>
    <log level="full">
        <property name="Sequence" value="AddToQueue"/>
        <property name="step" value="Message inserted"/>
    </log>
    <property name="FORCE_SC_ACCEPTED" scope="axis2" type="STRING" value="false"/>
    <property name="OUT_ONLY" scope="default" type="STRING" value="false"/>
</sequence>

端点代码

<endpoint name="insert-toqueue" xmlns="http://ws.apache.org/ns/synapse">
    <address uri="rabbitmq:/AMQPProxy?rabbitmq.server.host.name=rabbit.server&amp;rabbitmq.server.port=5672&amp;rabbitmq.server.user.name=username&amp;rabbitmq.server.password=password&amp;rabbitmq.queue.name=queue&amp;rabbitmq.server.virtual.host=/virtual-host&amp;rabbitmq.exchange.name=exchange"/>
</endpoint>

消费者代码

下方
<proxy name="rabbit-consumer" startOnLoad="true" trace="enable" transports="rabbitmq" xmlns="http://ws.apache.org/ns/synapse">
    <target>
        <inSequence>
            <property action="remove" name="SOAPAction" scope="transport"/>
            <property action="remove" name="WSAction" scope="transport"/>
            <property name="ContentType" scope="transport" type="STRING" value="application/json"/>
            <property name="messageType" scope="axis2" type="STRING" value="application/json"/>
            <property name="HTTP_METHOD" scope="axis2" type="STRING" value="POST"/>
            <property expression="json-eval($.name)" name="name" scope="default" type="STRING"/>
            <property expression="json-eval($.surname)" name="surname" scope="default" type="STRING"/>
            <log level="full"/>
            <call-template target="my-template">
                <with-param name="name" value="get-property('name')" xmlns:ns="http://org.apache.synapse/xsd"/>
                <with-param name="surname" value="get-property('surname')" xmlns:ns="http://org.apache.synapse/xsd"/>
            </call-template>
            <property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
        </inSequence>
        <outSequence/>
        <faultSequence/>
    </target>
    <parameter name="rabbitmq.exchange.type">fanout</parameter>
    <parameter name="rabbitmq.exchange.name">exchange</parameter>
    <parameter name="rabbitmq.queue.name">queue</parameter>
    <parameter name="rabbitmq.connection.factory">AMQPConnectionFactory</parameter>
</proxy>

你知道如何解决这个问题吗?非常感谢

【问题讨论】:

【参考方案1】:

您是否尝试重新启动?

通常它可以工作。

再见

【讨论】:

【参考方案2】:

当配置 RabbitMQ 发件人时,也许你可以尝试“缓存”一个。

<transportSender name="rabbitmq" class="org.apache.axis2.transport.rabbitmq.RabbitMQSender">
   <parameter name="CachedRabbitMQConnectionFactory" locked="false">
     <parameter name="rabbitmq.server.host.name" locked="false">localhost</parameter>
     <parameter name="rabbitmq.server.port" locked="false">5672</parameter>
     <parameter name="rabbitmq.server.user.name" locked="false">user</parameter>
     <parameter name="rabbitmq.server.password" locked="false">abc123</parameter>
   </parameter>
</transportSender>

文档链接:https://docs.wso2.com/display/EI611/RabbitMQ+AMQP+Transport

【讨论】:

嗨 Hasitha,我们尝试了您的解决方案,但每次通话后都会创建新频道:-(

以上是关于WSO2 rabbitMQ - 创建但未关闭的通道 - 内存泄漏问题的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ:查找由于消费者异常而导致通道关闭的原因

使用 WSO2 ESB 从 HTTP 切换到 RabbitMQ

AnyEvent::RabbitMQ 关闭通道的问题

初尝RabbitMQ消息队列

在 BasicAcks 中关闭 RabbitMQ 通道

WSO2 ESB:后端恢复后地址端点不恢复发送