0

特定の例外をトラップし、大規模な (100 以上のメソッド) インターフェイスですべてのメソッドを再試行するラッパーを作成したいと考えています。再試行コードは問題なく動作していますが、すべてのメソッドにカット アンド ペーストせずにインターフェイスの実装を接続する方法がわかりません。

不足しているメソッド ハンドラを使用しようとしましたが、インターフェイスを実装できませんでした。抽象化は、インスタンス化できないため、明らかにアウトです。

その場でテンプレートとしてクラスを作成するよりも良い解決策を望んでいますが、喜んでそうします。

4

2 に答える 2

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は、インターフェイス内のすべてのメソッド呼び出しのインターセプターとして機能します。各メソッドの例外を処理し、成功の結果を返します。

于 2013-07-03T02:48:10.290 に答える
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
}
于 2013-07-04T13:07:13.970 に答える