Retrying Method calls in generic way

a-sak picture a-sak · Jun 6, 2012 · Viewed 11.6k times · Source

My Java application requires a retry logic on remote calls failures. These remote calls are:

  • scattered all over the application
  • pertain to different Remote Service classes.

Also, the retry logic may have varying retry interval and varying retry attempts.

I need a generic retry() implementation which can make appropriate method calls depending on from where it is called. Below is a simple code illustration of I am looking for. I know we can attempt to do this using java reflection, but, is there a framework or an open source available somewhere which is read-to-use?

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
}

Answer

yegor256 picture yegor256 · Feb 3, 2013

As already suggested, you should use AOP and Java annotations. I would recommend a read-made mechanism from jcabi-aspects (I'm a developer):

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

Read also this blog post: http://www.yegor256.com/2014/08/15/retry-java-method-on-exception.html

Update: Check RetryFunc from Cactoos.