2013-07-03 54 views
0

我想创建一个包装程序,该包装程序可以捕获特定的异常并对大型(100多种方法)接口中的所有方法重试。我有重试代码,不用担心,但我无法弄清楚如何在不切割所有方法的情况下连接界面的实现。如何为大接口创建包装

我试图使用缺少的方法处理程序,但这意味着我不能让它实现接口。摘要显然是因为我无法实例化它。

我希望有一个更好的解决方案,比创建类作为模板上飞,但我愿意这样做。

回答

0

我试图使用@ 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 
} 
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作为接口中所有方法调用的拦截器。处理每种方法的异常并返回成功结果。

+0

我一直在使用此解决方案获取IllegalArgumentException。参考我的自我回答的工作版本(无论如何为正确的方向+1)。 –