Funktionalität für die automatische Wiederholung nach Ausnahme
Habe ich aus dieser abstrakten Klasse automatisch wiederholen-Netzwerk Anrufe, wenn einige exception geworfen wird.
- Ich aufpassen, um nicht erneut nach
InterruptedException
&
UnknownHostException
. - Ich wiederholen 5 mal. Nach jedem Versagen
Ich führe eine exponentielle wieder aus, ab 300ms gehen bis zu
1500ms.
public abstract class AutoRetry {
private Object dataToReturn = null;
public Object getDataToReturn() {
return this.dataToReturn;
}
public AutoRetry() {
short retry = -1;
while (retry++ < StaticData.NETWORK_RETRY) {
try {
Thread.sleep(retry * StaticData.NETWORK_CALL_WAIT);
this.dataToReturn = doWork();
break;
} catch (InterruptedException | UnknownHostException e) {
e.printStackTrace();
this.dataToReturn = null;
return;
} catch (IOException e) {
e.printStackTrace();
}
}
}
protected abstract Object doWork() throws IOException;
}
Ich benutze es wie folgt :
final Object dataAfterWork = new AutoRetry() {
@Override
protected Object doWork() throws IOException {
return; //a network call which returns something
}
}.getDataToReturn();
So ist diese Umsetzung gut/richtig ?
BEARBEITEN
verschoben https://codereview.stackexchange.com/questions/87686
- Ich würde
Java 8
Lambda-Ausdrücke - Fragen Sie nach einemSupplier<T>
und zurückT
. Dies würde drastisch verringern, boilerplate. - Gute Idee, aber ich nicht verwenden Java8. Seine android-Anwendung. (Hinzugefügt tag)
- Wenn Ihr code arbeitet, würde ich Ihnen raten, den Kopf über code-review hier codereview.stackexchange.com 😉
- Mein code immer noch gilt - die anonyme Klasse. Ihre Methode ist etwas unangenehm mit der
null
und die Zuordnung und diebreak
. Auch die Generika-in meinem Ansatz sind viel sauberer als IhreObject
. - Mein Rat ist, teilen Sie die Aufgabe aus der Ausführung; ich würde übergeben einer Runnable oder eine Benutzerdefinierte Schnittstelle zu AutoRetry; dies entkoppelt, was Sie tun, von der Politik wiederholen
- Ich denke, Boris, die Antwort entspricht deinen Vorschlag, richtig ?
- ja, es ist
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser sieht ziemlich gut aus, aber ich würde split der ausgeführten Aufgabe aus der Wiederholung. Auch Generika verwendet werden, nicht nur werfen
Object
über.Verwenden
Java 8
lambda und diereturn
der Methode:Außerdem verwenden Sie ein real logger, nicht
printStackTrace
...Verwendung:
Wenn Ihr lambda muss eine exception werfen, müssen Sie definieren Ihre eigenen
@FunctionalInterface
:Und verwenden Sie, dass in der Signatur der Methode, Sie benötigen, um generische
Exception
.Pre-Java-8 Verwendung:
Haben Sie einen Blick auf Failsafe. Es unterstützt wiederholen Richtlinien, synchrone und asynchrone Wiederholungen, Ereignis-Listener, die integration mit Java 8 ist CompletableFuture, etc. Ex: