WSO2 ESB + RabbitMQ Consumer:如何处理目标端点内部服务器错误

时间:2016-01-29 00:05:00

标签: wso2 rabbitmq wso2esb

我使用WSO2 ESB作为RabbitMQ使用者:我有一个代理服务,它使用来自Rabbit队列的消息并使用http端点将其发送到我的后端服务。 一切正常,消息成功传递到我的后端。

问题是我的后端服务有时会失败,我想知道这个事实并将此信息保存在ESB日志中。例如。

例如,我想记录HTTP/1.1 500 Internal Server Error错误。

我怎样才能做到这一点? 我发现我应该按顺序使用FORCE_ERROR_ON_SOAP_FAULT属性,但在我的情况下它不起作用。

我的消费者代理配置如下:

<proxy name="AMQPProxy" startOnLoad="true" statistics="enable"
    trace="enable" transports="rabbitmq">
    <description/>
    <target>
        <inSequence onError="fault">
            <log level="full"/>
            <property name="FORCE_SC_ACCEPTED" scope="axis2" value="true"/>
            <property name="OUT_ONLY" value="true"/>
            <property name="FORCE_ERROR_ON_SOAP_FAULT"
                scope="default" type="STRING" value="true"/>
            <send>
                <endpoint key="SampleEndPoint"/>
            </send>
        </inSequence>
        <outSequence>
            <log level="full">
                <property name="MESSAGE" value="outSequence"/>
            </log>
            <drop/>
        </outSequence>
    </target>
    <parameter name="rabbitmq.queue.routing.key">route</parameter>
    <parameter name="rabbitmq.exchange.name">exchange</parameter>
    <parameter name="rabbitmq.queue.name">queue</parameter>
    <parameter name="rabbitmq.connection.factory">AMQPConnectionFactory</parameter>
</proxy>

如何配置它来处理5xx错误?

修改

我最终使用以下代理配置来解决它:

<proxy name="AMQPProxy" startOnLoad="true" statistics="enable"
    trace="enable" transports="rabbitmq">
    <description/>
    <target>
        <inSequence onError="fault">
            <log level="full"/>
            <property name="FORCE_SC_ACCEPTED" scope="axis2" value="true"/>
            <send>
                <endpoint key="SampleEndPoint"/>
            </send>
        </inSequence>
        <outSequence>
            <log>
                <property expression="$axis2:HTTP_SC" name="Status Code"/>
            </log>
            <filter regex="^((?!(200|202)).)*$" source="$axis2:HTTP_SC">
                <then>
                    <property expression="$axis2:HTTP_SC" name="ERROR_CODE"/>
                    <property expression="$axis2:HTTP_SC_DESC" name="ERROR_MESSAGE"/>
                    <sequence key="fault"/>
                </then>
            </filter>
            <drop/>
        </outSequence>
    </target>
    <parameter name="rabbitmq.queue.routing.key">route</parameter>
    <parameter name="rabbitmq.exchange.name">exchange</parameter>
    <parameter name="rabbitmq.queue.name">queue</parameter>
    <parameter name="rabbitmq.connection.factory">AMQPConnectionFactory</parameter>
</proxy>

1 个答案:

答案 0 :(得分:0)

您可以修改故障序列以捕获此信息,例如:

<?xml version="1.0" encoding="UTF-8"?>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="fault">
    <!-- Log the message at the full log level with the ERROR_MESSAGE and the ERROR_CODE-->
    <log level="full">
        <property name="text" value="An unexpected error occured. Executing fault sequence"/>
        <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/>
        <property name="detail" expression="get-property('ERROR_DETAIL')"/>
        <property name="exception" expression="get-property('ERROR_EXCEPTION')"/>
        <property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/>
    </log>
    <!-- Drops the messages by default if there is a fault -->
    <drop/>
</sequence>

此外,您可能希望向客户端发送soap fault消息,因此您可以创建soapfault消息并以这种方式将其发送到客户端:

<makefault version="soap11">
    <code xmlns:tns="http://www.w3.org/2003/05/soap-envelope" value="tns:Receiver"/>
    <reason expression="get-property('ERROR_MESSAGE')"/>
</makefault>
<send/>
<drop/>