예제 #1
0
 protected <T, C extends Connection<T>> T acquire(C connection) {
   String errorMessage = String.format("(%s) error acquiring %s", toString(), connection);
   for (int i = 0; i < sshRetries; i++) {
     try {
       connection.clear();
       logger.debug(">> (%s) acquiring %s", toString(), connection);
       T returnVal = connection.create();
       logger.debug("<< (%s) acquired %s", toString(), returnVal);
       return returnVal;
     } catch (Exception from) {
       try {
         connection.clear();
       } catch (Exception e1) {
         logger.warn(from, "<< (%s) error closing connection", toString());
       }
       if (i + 1 == sshRetries) {
         logger.error(from, "<< " + errorMessage + ": out of retries %d", sshRetries);
         throw propagate(from, errorMessage);
       } else if (Throwables2.getFirstThrowableOfType(from, IllegalStateException.class) != null) {
         logger.warn(from, "<< " + errorMessage + ": " + from.getMessage());
         disconnect();
         backoffForAttempt(i + 1, errorMessage + ": " + from.getMessage());
         connect();
         continue;
       } else if (shouldRetry(from)) {
         logger.warn(from, "<< " + errorMessage + ": " + from.getMessage());
         backoffForAttempt(i + 1, errorMessage + ": " + from.getMessage());
         continue;
       } else {
         logger.error(from, "<< " + errorMessage + ": exception not retryable");
         throw propagate(from, errorMessage);
       }
     }
   }
   assert false : "should not reach here";
   return null;
 }