我使用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>
答案 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/>