2012-12-10 12 views
6

Chcę wdrożyć HttpRequestRetryHandler dla HttpClient na wypadek, że żądanie nie powiedzie się po raz pierwszy.Jak zaimplementować HttpRequestRetryHandler z Exponential Backoff?

Chciałbym również wdrożyć Exponential backoff dla kolejnych ponownych prób. Matematycznie może być realizowany jako

E(c) = 1/2(2 power (c) -1)

enter image description here

ale walczę od dłuższego czasu, aby wdrożyć go w kodzie z HttpRequestRetryHandler.

+0

Cześć Gaurav, jakie jest twoje ostateczne rozwiązanie? – Jerome

Odpowiedz

3

HttpRequestRetryHandler nie pozwala na taki poziom kontroli; jeśli chcesz zrobić coś bardzo specyficznego, polecam zaimplementować coś takiego jak Handler, w którym możesz publikować Runnables do wykonania z opóźnieniem, używając na przykład Handler.postDelayed() z rosnącymi opóźnieniami według twojej formuły.

Handler mHandler = new Handler(); 
int mDelay = INITIAL_DELAY; 

// try request 
mHandler.postDelayed(mDelay, new Runnable() { 
    public void run() { 
     // try your request here; if it fails, then repost: 
     if (failed) { 
      mDelay *= 2; // or as per your formula 
      mHandler.postDelayed(mDelay, this); 
     } 
     else { 
      // success! 
     } 
    } 
}); 
0

używam guava-retrying dla strategii ponownym zadaniem dowolnego wywołania funkcji.

zintegrować go z biblioteką Guavaberry że pisałem i że zawiera kilka strategii oczekujących, które pozwalają w łatwy sposób zbudować solidne wykładniczy backoff połączeniu z przedziału losowej (aka jitter): ExponentialJitterWaitStrategy

na przykład do budowy wykładniczy backoff ograniczona do 15 sekund i jitter 50% wywoływalnym:

Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder() 
     .retryIfResult(Predicates.isNull()) 
     .withWaitStrategy(WaitStrategies.exponentialJitterWait(Duration.ofSeconds(15), 0.5D)) 
     .build(); 
retryer.call(callable); 

bibliotekę sprawdzone i udokumentowane i może być łatwo zintegrowany poprzez Maven środkowej.

Mam nadzieję, że to może być pomocne.

+0

Wymaga JDK 1.8 – machinarium

Powiązane problemy