2012-12-10 2 views
6

Ich möchte eine HttpRequestRetryHandler für einen HttpClient implementieren, falls die Anfrage zum ersten Mal fehlschlägt.Wie implementiert man HttpRequestRetryHandler mit Exponential Backoff?

Ich möchte auch Exponential backoff für nachfolgende Wiederholungen zu implementieren. Mathematisch kann implementiert werden, wie

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

enter image description here

aber ich seit geraumer Zeit bin jetzt kämpfen sie im Code zu implementieren mit HttpRequestRetryHandler.

+0

Hallo Gaurav, was ist deine endgültige Lösung? – Jerome

Antwort

3

HttpRequestRetryHandler erlaubt Ihnen diese Kontrollebene nicht; Wenn Sie etwas sehr Spezifisches so machen möchten, würde ich empfehlen, etwas wie ein Handler zu implementieren, wo Sie Runnables mit einer Verzögerung, zum Beispiel Handler.postDelayed() mit zunehmenden Verzögerungen nach Ihrer Formel ausführen können.

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

Ich benutze guava-retrying für eine Strategie der erneuten Versuch beliebigen Funktionsaufruf.

integriere ich es mit einer Bibliothek Guavaberry die ich geschrieben habe und dass enthält mehrere Warten Strategien, die einen solideen exponentiellen Backoff kombiniert mit zufälligem Intervall leicht bauen lassen (auch bekannt als Jitter): ExponentialJitterWaitStrategy

Zum Beispiel für den Aufbau einen exponentiellen Backoff capped bis 15 Sekunden und mit Jitter von 50% auf einem aufrufbaren:

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

Die Bibliothek gut getestet und dokumentiert wird und einfach über Maven Zentrale integriert werden kann.

Ich hoffe, dass das helfen kann.

+0

Es erfordert JDK 1.8 – machinarium