11/16/2018

Retry Design

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.

Reference

spring-retry

No comments:

Post a Comment