我想创建一个包装器来捕获特定异常并重试大型(100+方法)接口中的所有方法。我有重试代码工作没有后顾之忧,但我无法弄清楚如何连接接口的实现没有cut'n'paste到所有方法。
我尝试使用缺少的方法处理程序,但这意味着我无法实现接口。摘要很明显,因为我无法实例化它。
我希望有更好的解决方案,而不是在运行中创建类作为模板,但我愿意这样做。
答案 0 :(得分:1)
您是否尝试覆盖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
作为接口中所有方法调用的拦截器。处理每个方法的异常并返回成功结果。
答案 1 :(得分:0)
我尝试使用@ dmahapatro的示例,但我一直收到IllegalArgumentException。我终于意识到它只发生在mixin方法上(该方法显示了mixin的签名)。而不是invoke()我需要使用doMethodInvoke()来获得适当的类型coersion。
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
}