2016-04-15 26 views
1

我有一個groovy組件內部正在拋出java.lang.IllegalArgumentException的成功塊。 ,直到成功的失敗表達我聲明表達#[exception.causedBy(java.lang.IllegalArgumentException異常)現在同步直到成功失敗表達不起作用

理想應該是真實和重試應該爲這個特殊的例外只發生,但他們都發生了每個異常也。即使我通過'#[false]'手動設置失敗表達式爲False,或者我設置了一個變量並將其值與自身進行比較(與變量本身的值進行比較),但它仍然無效。

<until-successful maxRetries="5" millisBetweenRetries="600" failureExpression="[exception.causedBy(java.net.SocketTimeoutException)]" doc:name="Until Successful" synchronous="true"> 
     <scripting:component doc:name="Groovy"> 
      <scripting:script engine="Groovy"><![CDATA[throw new IllegalArgumentException()]]></scripting:script> 
     </scripting:component> 
    </until-successful> 

我只是希望它重試特定的異常併爲它應該拋出異常,而不重試其他異常。

回答

1

我想你誤解了Until-Successful範圍如何與FailureExpression一起工作。

通過閱讀再次去文檔here,此範圍內的工作如下:

  • 默認情況下,如果有異常之內就拋出直到成功的重試。因此,如果現在拋出異常,則無論重新載入內容還是頭部,都不會嘗試重試
  • 如果配置了FailureExpression,則如果發生異常,則Until-Successful重試;如果FailureExpression的值爲true,則重試。閱讀此:

failureExpression:指定,當評價爲真正的表達式,確定一個路徑的處理是失敗的。如果未提供表達式,則只有異常將被視爲處理失敗。

就你而言,直到成功範圍確實重試,因爲你的FailureExpression被評估爲True。用#[true]代替這個表達式不可避免地使該範圍重試,直到達到配置的最大嘗試次數。

希望它幫助;)

/託尼

+0

感謝您的回覆託尼。抱歉誤會......我的意思是說,不管我是否保留爲真或假,它仍在重試每一個異常。 所以我想處理特定的異常,以重試在直到成功..休息我想直接扔到Catch塊沒有任何重試。 – srbhvatsa

+0

在這種情況下,我建議您將腳本塊放在單獨的流程中,並在您的成功範圍內使用''。從這個流程中,您可以添加一個專用於前者的異常策略,並指定除了少數幾個例外之外的所有內容。因此,直到成功的範圍將不再爲他們重試。 –