【问题标题】:HTTP Outbound Endpoint Exception on incorrect Path at the end of Flow流结束时路径不正确的 HTTP 出站端点异常
【发布时间】:2013-09-09 12:09:59
【问题描述】:

当我在子流程中像这样使用 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"/>

<http:outbound-endpoint exchange-pattern="request-response" address="www.myhost.com:80/SOMESERVICE.asmx?wsdl" contentType="text/xml" method="GET"/>

如果在该路径上找不到服务,我将收到 404。这是基于http状态404的流程中的句柄。当流程完成时,我得到这个异常(分三个部分,因为完整的堆栈跟踪对于StackOverflow来说太长了)(仅当路径属性不正确时,对于不正确的主机或端口属性不抛出异常):

第 1 部分:

WARN  2013-04-03 12:02:48,459 [[main].connector.http.mule.default.receiver.02] org.apache.cxf.phase.PhaseInterceptorChain: Application {http://support.cxf.module.mule.org/}ProxyService has thrown exception, unwinding now
    org.apache.cxf.interceptor.Fault: 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.module.cxf.MuleInvoker.invoke(MuleInvoker.java:151)
        at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)

第 2 部分:

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)

第 3 部分:

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="&lt;dummy/&gt;" 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="&lt;result&gt;OK&lt;/result&gt;" doc:name="OK"/>
        </when>
        <otherwise>
            <set-payload value="&lt;result&gt;NotAvailable&lt;/result&gt;" doc:name="NotAvailable"/>
        </otherwise>
    </choice>
</sub-flow>

我的主要流程确实使用了捕获异常策略,但这并没有捕获异常。 知道可能出了什么问题吗?

干杯,

图诺

【问题讨论】:

  • 你能分享你的完整配置吗?
  • 添加完整配置。

标签: mule esb


【解决方案1】:

我没有查看您的配置的猜测是您可能已将 sub-flow 声明为 &lt;flow&gt; 而不是 &lt;sub-flow&gt;

【讨论】:

  • 我也是这么想的。我之前确实有&lt;flow&gt;,但最近重构为&lt;sub-flow&gt;。问题还是一样。
【解决方案2】:

HTTP 状态 >= 400 本身不被视为异常。
如果你想让你的异常策略发挥作用,你需要根据 HTTP 状态码抛出一个异常。只需在&lt;flow-ref name="ping"/&gt; 之后添加以下内容:

<message-filter throwOnUnaccepted="true">
    <message-property-filter pattern="message.inboundProperties['http.status'] >= 400" />
</message-filter>

【讨论】:

  • 奇怪的是&lt;flow-ref name="ping"/&gt;之后payload是正确的xml响应而不是异常。请参阅 &lt;choice doc:name="Choice"&gt;&lt;mulexml:xslt-transformer maxIdleTransformers="2" maxActiveTransformers="5" doc:name="Response Transformation" xsl-file="response.xslt"/&gt;。我的日志证实了这一点。我不知道为什么在主流结束时仍然存在此异常。添加message-filter 只会抛出Message has been rejected by filter. Message payload is of type: byte[] 异常并隐藏不应该存在的原始异常。
猜你喜欢
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
相关资源
最近更新 更多