我想创建一个包装器来捕获特定异常并重试大型(100 多个方法)接口中的所有方法。我的重试代码不用担心,但我不知道如何在没有剪切粘贴到所有方法中的情况下连接接口的实现。
我尝试使用缺少的方法处理程序,但这意味着我无法让它实现接口。摘要显然已经过时了,因为我无法实例化它。
我希望有一个比动态创建类作为模板更好的解决方案,但我愿意这样做。
我想创建一个包装器来捕获特定异常并重试大型(100 多个方法)接口中的所有方法。我的重试代码不用担心,但我不知道如何在没有剪切粘贴到所有方法中的情况下连接接口的实现。
我尝试使用缺少的方法处理程序,但这意味着我无法让它实现接口。摘要显然已经过时了,因为我无法实例化它。
我希望有一个比动态创建类作为模板更好的解决方案,但我愿意这样做。
您是否尝试过覆盖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
用作接口中所有方法调用的拦截器。处理每个方法的异常并返回成功结果。
我尝试使用@dmahapatro 的示例,但我不断收到 IllegalArgumentException。我最终意识到它只发生在 mixin 方法中(该方法显示了 mixin 的签名)。我需要使用 doMethodInvoke() 而不是 invoke() 来获得适当的类型强制。
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
}