Mule 流末尾错误路径上的HTTP出站端点异常
当我在子流中使用HTTP出站端点(Mule 3.3.1)时,如下所示:Mule 流末尾错误路径上的HTTP出站端点异常,mule,esb,Mule,Esb,当我在子流中使用HTTP出站端点(Mule 3.3.1)时,如下所示: <http:outbound-endpoint exchange-pattern="request-response" host="www.myhost.com" port="80" path="SOMESERVICE.asmx?wsdl" contentType="text/xml" method="GET"/> 完整配置: <flow name="main"> <http:inbo
<http:outbound-endpoint exchange-pattern="request-response" host="www.myhost.com" port="80" path="SOMESERVICE.asmx?wsdl" contentType="text/xml" method="GET"/>
完整配置:
<flow name="main">
<http:inbound-endpoint exchange-pattern="request-response" address="http://localhost:8181/my-service/v1" doc:name="HTTP"/>
<cxf:proxy-service doc:name="SOAP" wsdlLocation="classpath:my-1.0.wsdl"
namespace="http://myservice.com/wsdl/my-service/1.0" service="myService" payload="envelope"/>
<logger level="TRACE" doc:name="Payload Logger" category="main" message="Payload: #[payload:java.lang.String]"/>
<flow-ref name="ping"/>
<!-- Exception should be catched here. -->
<catch-exception-strategy doc:name="Catch Exception Strategy">
<logger message="Exception: #[payload:java.lang.String]" level="ERROR" category="main" doc:name="Logger"/>
<set-payload value="<dummy/>" doc:name="Reset Payload"/>
<mulexml:xslt-transformer maxIdleTransformers="2" maxActiveTransformers="5" xsl-file="exception-response.xslt" doc:name="Exception Transformer">
<mulexml:context-property key="faultString" value="Unexpected Exception"/>
<mulexml:context-property key="errorCode" value="-1"/>
<mulexml:context-property key="errorMessage" value="Unexpected Exception."/>
</mulexml:xslt-transformer>
</catch-exception-strategy>
</flow>
<sub-flow name="ping">
<logger message="Request payload: #[payload:java.lang.String]" level="TRACE" category="ping" doc:name="Logger"/>
<flow-ref name="http" />
<mulexml:xslt-transformer maxIdleTransformers="2" maxActiveTransformers="5" doc:name="Response Transformation" xsl-file="response.xslt"/>
<!-- Here the correct response is printed and no exception. -->
<logger message="Response payload after transformation: #[payload:java.lang.String]" level="TRACE" category="ping" doc:name="Logger"/>
</sub-flow>
<sub-flow name="http">
<logger message="Request payload: #[payload:java.lang.String]" level="TRACE" category="http" />
<http:outbound-endpoint exchange-pattern="request-response" address="www.myhost.com:80/SOMESERVICE.asmx?wsdl" contentType="text/xml" method="GET"/>
<choice doc:name="Choice">
<when expression="#[message.inboundProperties['http.status'] == 200]">
<set-payload value="<result>OK</result>" doc:name="OK"/>
</when>
<otherwise>
<set-payload value="<result>NotAvailable</result>" doc:name="NotAvailable"/>
</otherwise>
</choice>
</sub-flow>
我的主流确实使用捕获异常策略,但这并没有捕获异常。
你知道哪里不对吗
干杯
Tuno我猜在不查看配置的情况下,您可能已将
子流
声明为
而非HTTP状态>=400本身不被视为例外如果你想让你的异常策略发挥作用,你需要根据HTTP状态码抛出一个异常。只需在
之后添加以下内容:<message-filter throwOnUnaccepted="true">
<message-property-filter pattern="message.inboundProperties['http.status'] >= 400" />
</message-filter>
您能分享您的完整配置吗?添加了完整配置。这也正是我的想法。我最初确实有
,但最近被重构为
。问题仍然是一样的。奇怪的是,在
之后,有效负载是正确的xml响应,而不是异常。请参见
和
。我的日志证实了这一点。我不知道为什么这个异常仍然存在于主流程的末尾。添加消息过滤器
只会抛出消息已被过滤器拒绝。消息负载的类型为:byte[]
exception,并隐藏不应该存在的原始异常。
Caused by: org.mule.api.transport.DispatchException: Failed to route event via endpoint: DefaultOutboundEndpoint{endpointUri=http://www.myhost.com:80/SOMESERVICE.asmx?wsdl, connector=HttpConnector
{
name=connector.http.mule.default
lifecycle=start
this=6215723d
numberOfConcurrentTransactedReceivers=4
createMultipleTransactedReceivers=true
connected=true
supportedProtocols=[http]
serviceOverrides=<none>
}
, name='endpoint.http.www.myhost.com.80.SOMESERVICE.asmx.wsdl', mep=REQUEST_RESPONSE, properties={wsdl=, http.method=GET}, transactionConfig=Transaction{factory=null, action=INDIFFERENT, timeout=0}, deleteUnacceptedMessages=false, initialState=started, responseTimeout=10000, endpointEncoding=UTF-8, disableTransportTransformer=false}. Message payload is of type: GetMethod
at org.mule.transport.http.HttpClientMessageDispatcher.doSend(HttpClientMessageDispatcher.java:278)
Caused by: org.mule.transport.http.HttpResponseException: Not Found, code: 404
at org.mule.transport.http.HttpClientMessageDispatcher.doSend(HttpClientMessageDispatcher.java:278)
<flow name="main">
<http:inbound-endpoint exchange-pattern="request-response" address="http://localhost:8181/my-service/v1" doc:name="HTTP"/>
<cxf:proxy-service doc:name="SOAP" wsdlLocation="classpath:my-1.0.wsdl"
namespace="http://myservice.com/wsdl/my-service/1.0" service="myService" payload="envelope"/>
<logger level="TRACE" doc:name="Payload Logger" category="main" message="Payload: #[payload:java.lang.String]"/>
<flow-ref name="ping"/>
<!-- Exception should be catched here. -->
<catch-exception-strategy doc:name="Catch Exception Strategy">
<logger message="Exception: #[payload:java.lang.String]" level="ERROR" category="main" doc:name="Logger"/>
<set-payload value="<dummy/>" doc:name="Reset Payload"/>
<mulexml:xslt-transformer maxIdleTransformers="2" maxActiveTransformers="5" xsl-file="exception-response.xslt" doc:name="Exception Transformer">
<mulexml:context-property key="faultString" value="Unexpected Exception"/>
<mulexml:context-property key="errorCode" value="-1"/>
<mulexml:context-property key="errorMessage" value="Unexpected Exception."/>
</mulexml:xslt-transformer>
</catch-exception-strategy>
</flow>
<sub-flow name="ping">
<logger message="Request payload: #[payload:java.lang.String]" level="TRACE" category="ping" doc:name="Logger"/>
<flow-ref name="http" />
<mulexml:xslt-transformer maxIdleTransformers="2" maxActiveTransformers="5" doc:name="Response Transformation" xsl-file="response.xslt"/>
<!-- Here the correct response is printed and no exception. -->
<logger message="Response payload after transformation: #[payload:java.lang.String]" level="TRACE" category="ping" doc:name="Logger"/>
</sub-flow>
<sub-flow name="http">
<logger message="Request payload: #[payload:java.lang.String]" level="TRACE" category="http" />
<http:outbound-endpoint exchange-pattern="request-response" address="www.myhost.com:80/SOMESERVICE.asmx?wsdl" contentType="text/xml" method="GET"/>
<choice doc:name="Choice">
<when expression="#[message.inboundProperties['http.status'] == 200]">
<set-payload value="<result>OK</result>" doc:name="OK"/>
</when>
<otherwise>
<set-payload value="<result>NotAvailable</result>" doc:name="NotAvailable"/>
</otherwise>
</choice>
</sub-flow>
<message-filter throwOnUnaccepted="true">
<message-property-filter pattern="message.inboundProperties['http.status'] >= 400" />
</message-filter>