Sometimes, Network is inherently unreliable. Connections will occasionally time out or be dropped. For some reasons, we still want to try to establish a connection to a remote endpoint which went down.
There is straightforward answer which wrote down below code to resolve it.
try
{
this.conn = connect();
}
catch (Exception e)
{
for (int i = 0; i < maxAttempts; i++)
{
try { Thread.sleep(1000); } catch (InterruptedException e) {};
this.conn = connect();
}
}
But the solution is difficult to maintain and a lack of flexibility. If we are using java8, this may change below to more be useful.
public static <T> Object retry(Supplier<T> function, int retryCount) throws Exception
{
while (0 < retryCount)
{
try
{
return function.get();
}
catch (Exception e)
{
if ((retryCount--) == 0)
throw e;
}
}
return null;
}
Based on above two solutions, we still try to add extra code into connection logic and the unnecessary design. I think there's much better to use if you are using spring or AOP concept.
@Retryable(maxAttempts = 3, backoff = @Backoff(delay = 500))
public void establishConnection() {
this.connection = newConnection();
}
Code is simply and easy to use.