12
A
回答
12
你可以建立在Groovy自己的輔助方法來封裝此重試邏輯。
def retry(int times = 5, Closure errorHandler = {e-> log.warn(e.message,e)}
, Closure body) {
int retries = 0
def exceptions = []
while(retries++ < times) {
try {
return body.call()
} catch(e) {
exceptions << e
errorHandler.call(e)
}
}
throw new MultipleFailureException("Failed after $times retries", exceptions)
}
(假設MultipleFailureException類似於GPars' AsyncException定義)
然後在代碼,可以按如下方式使用此方法。
retry {
errorProneOperation()
}
,或者用不同的重試次數和錯誤處理行爲:
retry(2, {e-> e.printStackTrace()}) {
errorProneOperation()
}
1
現在人們會建議您使用ScheduledExecutorService來實現這種try-catch-retry功能,因爲Thread.sleep()
被認爲過時並且可能對性能不利。我想通過cletus向你指出一個很好的答案,但不能在我的生活中找到它。如果我可以挖掘它,我會更新我的答案。
編輯:找到它:How to retry function request after a certain time希望這對你有一些幫助。
1
我可以建議效仿還挺相同的(我不知道有關的retry
語義):
def retry(handler, c) {
try {
c()
} catch(e) {
handler(e)
retry(handler, c) // restart from beginning
}
}
def handler = {e ->
// handles error
}
retry(handler) {
do_something // exception raised
}
相關問題
- 1. 重載方法的Groovy單元測試
- 2. groovy中groovy的重寫庫?
- 3. MissingMethodException嘗試在Eval中Groovy
- 4. 在Groovy中測試URL
- 5. 在Java/Groovy中重試的活動事件
- 6. 調試Groovy腳本
- 7. 調試Ruby/Python/Groovy
- 8. Groovy - 集成測試
- 9. groovy單元測試
- 10. 如何在SoapUi中使用Groovy重命名測試用例或測試步驟
- 11. 在Jenkins中調試Groovy腳本管道
- 12. 試圖在groovy中計算年齡
- 13. IllegalAccessException試圖訪問StringHashMap - Groovy
- 14. Groovy調試器不同步
- 15. Groovy測試的Maven插件
- 16. Groovy單元測試用例
- 17. 在Groovy中爲數字重寫asBoolean
- 18. 在Groovy中重寫Joda DateTime toString
- 19. 在Groovy中重新引發異常
- 20. Groovy是否尊重@PostConstruct?
- 21. Java泛型和Groovy重載
- 22. Groovy多重資源關閉
- 23. 重用Groovy CompilerConfiguration對象
- 24. Groovy - 多重捕獲組
- 25. 在Groovy
- 26. 在Groovy
- 27. 在Groovy
- 28. 在Groovy
- 29. 在Groovy
- 30. 試圖驗證的Groovy閉包在一個單元測試
現在,如果'IllegalStateException'將使用一個例外(第一最後很難說?)作爲它的原因,它會更**更有用,因爲你可以看到**爲什麼**它失敗了。在生產中,我不希望每次嘗試失敗都要打印一個堆棧跟蹤。如果所有重試失敗,我只想知道它。 –
感謝約阿希姆 - 關於我在收集個別例外時的建議。至於不想要堆棧跟蹤 - 當然,這只是爲了說明這一點。由於異常現在正在收集到最後報告,可能errorHandler的目的是在'body.call()'重試之前重置所需的任何資源 - 在這種情況下,默認的閉包可能只是'{ - >} ' – winstaan74
我結束了使用非常相似的東西。感謝winstaan。 –