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

WSO2 ESB: Address endpoint does not resume sending after backends recovery

我正在将 WSO2 ESB 与 RabbitMQ 一起使用,我有两个代理服务:

除一种情况外一切正常:

  1. 我在 SampleEndPoint 中设置的后端服务出现故障。
  2. 新消息到达并通过 AMQPProducerSample 发布,传递失败(这是预期的,因为我的后端已关闭)。在控制台中我可以看到:

    WARN - ConnectCallback Connection refused or failed for : mfb.localhost/127.0.0.1:80
    WARN - FaultHandler ERROR_CODE : 101503
    WARN - FaultHandler ERROR_MESSAGE : Error connecting to the back end
    WARN - FaultHandler ERROR_DETAIL : Error connecting to the back end
    WARN - FaultHandler ERROR_EXCEPTION : null
    WARN - FaultHandler FaultHandler : Endpoint [SampleEndPoint]
    
  3. 我的后端服务恢复并可用

  4. 新消息到达并通过 AMQPProducerSample 发布,但我的端点 不再收到任何消息。仅当未传递的消息数低于 5 时,它才能正常工作。在这种情况下,消息会成功传递到后端服务。在 5(五)条未投递的消息后,投递总是停止工作。

如何解决这个问题?是否需要设置或更改任何选项以使其始终有效?

我正在使用 WSO2 ESB 4.8.1

以下是我的完整配置:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://ws.apache.org/ns/synapse">
    <registry provider="org.wso2.carbon.mediation.registry.WSO2Registry">
        <parameter name="cachableDuration">15000</parameter>
    </registry>
    <proxy name="AMQPProxy"
           transports="rabbitmq"
           startOnLoad="true"
           trace="enable">
        <description/>
        <target>
            <inSequence>
                <log level="full"/>
                <property name="OUT_ONLY" value="true"/>
                <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
                <send>
                    <endpoint key="SampleEndPoint"/>
                </send>
            </inSequence>
        </target>
        <parameter name="rabbitmq.queue.name">queue</parameter>
        <parameter name="rabbitmq.connection.factory">AMQPConnectionFactory</parameter>
        <parameter name="rabbitmq.exchange.name">exchange</parameter>
        <parameter name="rabbitmq.queue.routing.key">route</parameter>
    </proxy>
    <proxy name="AMQPProducerSample"
           transports="http"
           startOnLoad="true"
           trace="disable">
        <description/>
        <target>
            <inSequence>
                <property name="OUT_ONLY" value="true"/>
                <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
                <property name="NO_KEEPALIVE" value="true" scope="axis2"/>
                <send>
                    <endpoint>
                        <address uri="rabbitmq:/AMQPProxy?rabbitmq.server.host.name=localhost&amp;rabbitmq.server.port=5672&amp;rabbitmq.queue.name=queue&amp;rabbitmq.queue.routing.key=route&amp;rabbitmq.exchange.name=exchange"/>
                    </endpoint>
                </send>
            </inSequence>
            <outSequence>
                <send/>
            </outSequence>
        </target>
    </proxy>
    <endpoint name="SampleEndPoint">
        <address uri="http://mfb.localhost/">
            <timeout>
                <duration>1000</duration>
                <responseAction>discard</responseAction>
            </timeout>
            <suspendOnFailure>
                <errorCodes>-1</errorCodes>
                <progressionFactor>1.0</progressionFactor>
            </suspendOnFailure>
            <markForSuspension>
                <errorCodes>-1</errorCodes>
            </markForSuspension>
        </address>
    </endpoint>
    <sequence name="fault">
        <log level="full">
            <property name="MESSAGE" value="Executing default 'fault' sequence"/>
            <property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/>
            <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/>
        </log>
        <drop/>
    </sequence>
    <sequence name="main">
        <in>
            <log level="full"/>
            <filter source="get-property('To')" regex="http://localhost:9000.*">
                <send/>
            </filter>
        </in>
        <out>
            <send/>
        </out>
        <description>The main sequence for the message mediation</description>
    </sequence>
</definitions> 

您必须在 axis2.xml

中更改 rabbitmq 的 transportReceiver 中的以下参数
<parameter name="rabbitmq.connection.retry.count" locked="false">5</parameter>

"rabbitmq.connection.retry.count" 是每次重试后尝试重新连接的次数,我想你已经将它设置为 5,这就是为什么在尝试五次后连接断开的原因。调大参数试试

这是 ESB 4.8.1 新包中存在的已知错误。后来我们修好了。因此,我建议您切换到已解决此问题的 ESB 4.9.0 版本。

[1] https://docs.wso2.com/display/ESB490/Downloading+the+Product