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

Posted

技术标签:

【中文标题】WSO2 ESB:后端恢复后地址端点不恢复发送【英文标题】:WSO2 ESB: Address endpoint does not resume sending after backends recovery 【发布时间】:2015-10-10 11:14:51 【问题描述】:

我在 RabbitMQ 中使用 WSO2 ESB,我有两个代理服务:

AMQPProducerSample,它通过HTTP传输接收消息并将其发送到RabbitMQ队列 AMQPProxy 它作为 RabbitMQ 队列的消费者(通过 rabbitmq 传输),消费的消息被发送到 HTTP 端点 SampleEndPoint

除了一种情况外,一切正常:

    我在SampleEndPoint 中设置的后端服务出现故障。

    新消息到达并通过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]
    

    我的后端服务恢复并可用

    新消息到达并通过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> 

【问题讨论】:

【参考方案1】:

这是 ESB 4.8.1 新包中的一个已知错误。后来我们修复了它。因此,我建议您切换到已修复此问题的 ESB 4.9.0 版本。

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

【讨论】:

我很惊讶以前版本 (4.8.1) 中的补丁没有修复如此严重的错误。无论如何,我们按照您的建议将 ESB 升级到了最新版本 (4.9.0)。 此错误已通过 ESB 4.8.1 版本中的补丁修复。 你能告诉我它是在哪个补丁中修复的吗?我刚刚应用了我在这里找到的所有补丁:maven.wso2.org/nexus/content/groups/wso2-public/org/wso2/carbon/… 但问题仍然存在于 4.8.1 这些补丁不向公众提供。它仅适用于获得生产支持的人员。【参考方案2】:

您必须在axis2.xml中为rabbitmq更改transportReceiver中的以下参数

<parameter name="rabbitmq.connection.retry.count" locked="false">5</parameter>

“rabbitmq.connection.retry.count”是每次重试后尝试重新连接的次数,我认为您已将其设置为5,这就是五次尝试后连接断开的原因。增加参数值试试看。

【讨论】:

不幸的是它不起作用。据我了解,此选项适用于 ESB 和 RabbitMQ 服务器之间的连接。就我而言,ESB(HTTP 端点)和我的后端服务器之间存在问题。 我今天做了一些调试(ESB 在调试模式下运行),我发现连接线程不会从线程轮询中删除,以防万一失败。线程轮询大小被硬编码为 5 个线程,因此在 5 次失败后交付停止工作。 似乎,不支持 ESB 4.8.1 新副本,后来通过官方补丁修复了这个问题,所以没有补丁我们无法添加参数“ 5"。但在最新的 ESB 版本 4.9.0 中,此问题已得到修复。

以上是关于WSO2 ESB:后端恢复后地址端点不恢复发送的主要内容,如果未能解决你的问题,请参考以下文章

亚马逊EC2服务器重启后,IP地址发送了变化,如何恢复之前的IP地址?是需要联系客服还是在哪里可以配置?

为什么JSON路径无效为WSO2 ESB 5.0的JSON请求

放大如何恢复后端定义?

密码恢复不发送电子邮件。

Windows 逆向OD 调试器工具 ( OD 调试数据时硬件断点对应的关键代码 | 删除硬件端点恢复运行 )

wso2 esb 不支持的媒体类型