2016-07-23 59 views
0

我正在使用直到成功重試調用Web服務,只有當它關閉。
下面是我曾嘗試:騾3.7直到成功失敗表達不起作用

<until-successful maxRetries="10" failureExpression="#[(message.inboundProperties['http.status'] != 200) &amp;&amp; (message.inboundProperties['http.status'] != 500)]" synchronous="true" millisBetweenRetries="5000"> 

<flow-ref name="callSubFlow" doc:name="Flow Reference"/> 

如果我得到我也不想再試調用Web服務的HTTP響應500。我嘲笑了一個Web服務,並且它返回一個HTTP 500響應,直到成功不斷重試調用Web服務。上面的失敗表達有什麼問題?

謝謝

回答

0

這是如何解決我的問題。我創建了另一個只捕獲Web Service 500錯誤的流。直到成功,然後不再重新調用Web服務。

<until-successful maxRetries="${webservice.timeout.max.retries}" failureExpression="#[exception != null &amp;&amp; (exception.causedBy(java.net.ConnectException) || exception.causedBy(java.net.SocketTimeoutException) || exception.causedBy(java.util.concurrent.TimeoutException) || exception.causedBy(java.net.SocketException))]" 
synchronous="true" millisBetweenRetries="5000" > 
<processor-chain doc:name="Processor Chain"> 


     <set-payload value="#[payLoad]" /> 
     <flow-ref name="Flow1" /> 

    </processor-chain> 
</until-successful> 

<flow name="Flow1"> 
<ws:consumer config-ref="WSConsumerConfig" operation="execute" /> 
    <choice-exception-strategy doc:name="Choice Exception Strategy"> 


     <catch-exception-strategy doc:name="Catch Exception Strategy" when="#[exception != null &amp;&amp; exception.causedBy(org.mule.module.ws.consumer.SoapFaultException)]"> 

     <logger message="SoapFaultException occurred." level="INFO" doc:name="Logger"/> 
     <set-payload value="#[exception]" doc:name="Set Payload"></set-payload> 
    </catch-exception-strategy> 

    </choice-exception-strategy> 
</flow> 
1

這個表達式有很多混淆。根據文檔,

失敗:「直到成功範圍內的消息處理器將引發異常或包含異常有效內容,並且如果在屬性failureExpression中提供了表達式並且它的計算結果爲true。

https://docs.mulesoft.com/mule-user-guide/v/3.6/until-successful-scope#success-and-failure

這裏美中不足的是,與當前執行騾子「failureExpression」的檢查,並在沒有拋出異常使用。否則,如果發生異常,它總會重試。解決您的問題的方法是爲特定異常設置catch塊,然後設置屬性,在failureExpression中評估要重試的屬性,直到成功爲止。基本上,你會使用遞歸技術類型的代碼進行重試。

示例代碼:

<until-successful maxRetries="10" failureExpression="#[flowVars['errorInActualOutboundFlow']]" synchronous="true" millisBetweenRetries="5000"> 
    <flow-ref name="callActualOutboundFlow" doc:name="Flow Reference"/> 
</until-successful> 

實際出站流量:

<flow name="callActualOutboundFlow" processingStrategy="synchronous">   
    <http:request config-ref="HTTP_Request_Configuration" path="/" method="GET" doc:name="HTTP"/> 
    <choice-exception-strategy doc:name="Choice Exception Strategy"> 
     <catch-exception-strategy doc:name="Catch Exception Strategy" when="#[exception.causedBy(java.net.ConnectException)]"> 
      <logger message="#### Until-Successful will retry in this case " level="INFO" doc:name="Logger"/> 
      <set-variable variableName="errorInActualOutboundFlow" value="#[true]" doc:name="Variable"/> 
     </catch-exception-strategy> 
     <catch-exception-strategy doc:name="Catch Exception Strategy"> 
      <set-variable variableName="errorInActualOutboundFlow" value="#[false]" doc:name="Copy_of_Variable"/> 

0

您還需要告訴HTTP請求組件500在非故障情況在這種情況下。因爲默認200是成功的場景,除了'success-status-code-validator'中需要提及的東西外。

<until-successful maxRetries="5" synchronous="true" doc:name="Until Successful" failureExpression="#[ message.inboundProperties['http.status'] != 200 &amp;&amp; message.inboundProperties['http.status'] != 500  ]" millisBetweenRetries="1000"> 
     <http:request config-ref="HTTP_Request_Configuration" path="test1" method="GET" doc:name="HTTP"> 
      <http:success-status-code-validator values="200,500"/>. 
     </http:request> 
</until-successful> 

,而不是直接使用HTTP這裏,相信你使用callSubFlow那裏有你使用的HTTP請求,在<http:success-status-code-validator values="200,500"/>作爲成功不在話下。所以它不會在這種情況下重試,按預期工作。 如果您想要將500作爲200以外的獨立邏輯處理,您可以通過檢查其message.inboundProperties ['http.status']並在200500的基礎上繼續進行邏輯,在http:request之後執行條件檢查。

你的情況是失敗的,因爲Http請求說'500'爲失敗,直到提到非失敗。

+0

感謝您的回覆。我正在使用Web服務使用者,如: 我只需要弄清楚在哪裏添加http:success-status-code-validator。我的http配置是: max