@Override public void continueOrPropagate(RetryableException exception) { failedAttemptsForCurrentServer.increment(); if (backoffStrategy.backoff(failedAttemptsForCurrentServer.get())) { // Use same server again. log.info("{}: {}. Attempt #{} failed for server {}. Retrying the same server.", exception.getCause(), exception.getMessage(), failedAttemptsForCurrentServer.get(), servers.get(currentServer.get())); } else { // Use next server or fail if all servers have failed. failedServers.increment(); if (failedServers.get() >= servers.size()) { // Attempted to call all servers - propagate exception. // Note: Not resetting state here since Feign calls clone() before re-using this retryer. throw exception; } else { // Call next server in list. log.info("{}: {}. Server #{} ({}) failed {} times - trying next server", exception.getCause(), exception.getMessage(), failedServers.get(), servers.get(currentServer.get()), failedAttemptsForCurrentServer.get()); currentServer.set((currentServer.get() + 1) % servers.size()); failedAttemptsForCurrentServer.set(0); } } }