我想創建一個包裝程序,該包裝程序可以捕獲特定的異常並對大型(100多種方法)接口中的所有方法重試。我有重試代碼,不用擔心,但我無法弄清楚如何在不切割所有方法的情況下連接界面的實現。如何爲大接口創建包裝
我試圖使用缺少的方法處理程序,但這意味着我不能讓它實現接口。摘要顯然是因爲我無法實例化它。
我希望有一個更好的解決方案,比創建類作爲模板上飛,但我願意這樣做。
我想創建一個包裝程序,該包裝程序可以捕獲特定的異常並對大型(100多種方法)接口中的所有方法重試。我有重試代碼,不用擔心,但我無法弄清楚如何在不切割所有方法的情況下連接界面的實現。如何爲大接口創建包裝
我試圖使用缺少的方法處理程序,但這意味着我不能讓它實現接口。摘要顯然是因爲我無法實例化它。
我希望有一個更好的解決方案,比創建類作爲模板上飛,但我願意這樣做。
我試圖使用@ dmahapatro的例子,但我一直得到IllegalArgumentException。我最終意識到,它只發生在mixin方法中(該方法顯示mixin的簽名)。而不是invoke()我需要使用doMethodInvoke()來獲得適當的類型轉換。
errorProneInstance.metaClass.invokeMethod = { String name, args ->
def result
def method = delegate.metaClass.getMetaMethod(name, args)
while(true) {
try {
result = method.doMethodInvoke(delegate, args)
break
} catch (AnnoyingIntermittentButRetryableException e) {
print "ignoring exception"
}
}
result
}
您是否嘗試過覆蓋invokeMethod
的界面?
YourInterface.metaClass.invokeMethod = {String name, args ->
def result
println "Calling method $name"
try{
result = metaClass.getMetaMethod(name, args).invoke(delegate, args)
}catch(YourException | AnyOtherException | Exception e){
println "Handling exception for method $name"
result = //Call retry code here
}
println "Called method $name"
result
}
覆蓋invokeMethod
作爲接口中所有方法調用的攔截器。處理每種方法的異常並返回成功結果。
我一直在使用此解決方案獲取IllegalArgumentException。參考我的自我回答的工作版本(無論如何爲正確的方向+1)。 –