我想创建一个包装程序,该包装程序可以捕获特定的异常并对大型(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)。 –