以通用方式重试方法调用

a-s*_*sak 8 java reflection frameworks openframeworks

我的Java应用程序需要在远程调用失败时使用重试逻辑.这些远程呼叫是:

  • 散落在整个应用程序中
  • 属于不同的远程服务类.

而且,重试逻辑可以具有变化的重试间隔和变化的重试尝试.

我需要一个通用的retry()实现,它可以根据调用的位置进行适当的方法调用.下面是我正在寻找的简单代码示例.我知道我们可以尝试使用java反射来实现这一点,但是,是否有一个可以读取使用的框架或开源?

try {
 ClassA objA = remoteServiceA.call(paramA1, paramA2, ...);
} catch (Exception e){
 ClassA objA = (ClassA)retry(remoteService, listOfParams, ..); // generic method call
}
..

try {
 ClassB objB = remoteServiceB.call(paramB1, paramB2, ...);
} catch (Exception e){
 ClassA objB = (ClassB)retry(remoteService, listOfParams, ..); // generic method call
}
Run Code Online (Sandbox Code Playgroud)

yeg*_*256 11

如前所述,您应该使用AOP和Java注释.我建议使用jcabi-aspects(我是开发人员)的读取机制:

@RetryOnFailure(attempts = 3, delay = 5)
public String load(URL url) {
  return url.openConnection().getContent();
}
Run Code Online (Sandbox Code Playgroud)

另请阅读此博客文章:http://www.yegor256.com/2014/08/15/retry-java-method-on-exception.html

更新:RetryFuncCactoos检查.


Mar*_*nen 0

您从哪里获得服务?使用工厂来代理您从原始工厂获得的服务。然后代理可以透明地实现重试。请参阅反射中的 java Proxy/ProxyGenerators。