Java: wie geht man mit Wiederholungen ohne copy-paste-code?
Ich habe mehrere Fälle, in denen ich zu tun haben Wiederaufnahmeverfahren für DB-und Netzwerk-Operationen. Überall, wo ich es tun, ich habe die folgende code-Typ:
for (int iteration = 1; ; iteration++) {
try {
data = doSomethingUseful(data);
break;
} catch (SomeException | AndAnotherException e) {
if (iteration == helper.getNumberOfRetries()) {
throw e;
} else {
errorReporter.reportError("Got following error for data = {}. Continue trying after delay...", data, e);
utilities.defaultDelayForIteration(iteration);
handleSpecificCase(data);
}
}
}
Das Problem ist, dass diese code-Muster ist kopieren-einfügen in meinem ganzen Klassen. Das ist wirklich schlecht. Ich kann nicht herausfinden, wie, um loszuwerden, dieses für-Pause-catch-copy-paste-Muster, da ich in der Regel verschiedene Ausnahme zu behandeln, ich möchte die log-Daten, die ich nicht auf (in der Regel auch verschiedene Arten).
Ist es ein guter Weg, um dies zu vermeiden kopieren-einfügen in Java 7?
Edit: ich tun, verwenden Sie guice für dependency injection. Ich habe überprüft Ausnahmen. Es könnten mehrere Variablen anstatt nur eine die Daten und Sie sind alle unterschiedlichen Typs.
Edit2: AOP-Ansatz sieht sich als Erfolg versprechend für mich.
- Warum sind die Ausnahmen, oft verschiedene, wenn dies alle DB-Zugriff-code? Können Sie ein paar Beispiele?
- Ich habe gerade bearbeitet die Frage, aber die Argumentation ist, dass es DB und Vernetzung und ist auch nur für DB-je nach Betrieb wird es scheitern mit verschiedenen Ausnahme. Auch doSomethingUseful() könnte dir meine eigenen Ausnahmen, das will ich behandeln die gleiche Weise.
- sind die Ausnahmen aktiviert oder deaktiviert?
- Es sind checked und unchecked exceptions
- es ist eine ähnliche Frage: stackoverflow.com/questions/13239972/... ich nahm die akzeptierte Antwort.
- die akzeptierte Antwort ist, was ich versucht habe, zu vermeiden. Da funktioniert es perfekt wenn Sie nur es einmal, aber Sie produziert ein copy-paste Lösung, wenn Sie wiederholen in einer Menge von Orten. Danke für den link jedenfalls!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Off-hand, die ich denken kann, zwei verschiedene Ansätze:
Wenn die Unterschiede in der Ausnahmebehandlung kann deklarativ ausgedrückt werden, könnten Sie mit AOP zu Weben, die exception-handling-code, um Ihre Methoden. Dann, Ihre business-code könnte wie folgt Aussehen:
Der Vorteil ist, dass es wirklich einfach ist, retry-Verhalten eine Methode, der Nachteil ist die Komplexität des Webens, die Beratung (die Sie nur umsetzen müssen, einmal. Wenn Sie mit einem dependency-injection-Bibliothek, die Chancen sind Sie werden bieten Methode abfangen Unterstützung).
Anderer Ansatz ist die Verwendung des command pattern:
Das problem mit dem Befehl Muster sind die Methode Argumente. Sie sind nur auf einen einzigen parameter, und die Generika sind eher sperrigen für den Anrufer. Außerdem funktioniert es nicht mit checked exceptions. Auf der plus-Seite, keine Lust AOP Sachen 🙂
Wie bereits vorgeschlagen, AOP und Java-Annotationen ist eine gute option. Ich würde empfehlen, mit einer read-made-Mechanismus von jcabi-Aspekte:
Lesen Sie dazu auch diesen blog-Beitrag: http://www.yegor256.com/2014/08/15/retry-java-method-on-exception.html
Implementierte ich die RetryLogic Klasse, unterhalb dessen bietet wiederverwendbare wiederholen Sie die Logik und unterstützt Parameter, da der code wiederholt werden soll, ist in einer Stellvertretung übergeben.
Unten ist ein Beispiel. Der code wiederholt werden soll, ist in der call-Methode.
In Fall, dass Sie wollen, um zu wiederholen, nur, wenn eine bestimmte Art von exception Auftritt (und nicht auf alle anderen Arten von Ausnahmen) die RetryLogic-Klasse unterstützt eine Ausnahme der Klasse parameter.
Machen Sie Ihre
doSomething
eine Schnittstelle implementieren, z.B.Runable
und erstellen Sie eine Methode mit deinem code oben mitdoSomething
ersetzt mitinterface.run(data)
werfen Sie einen Blick auf: dies wiederholen utility
diese Methode sollte funktionieren für die meisten Anwendungsfälle:
können Sie eassily implementieren Sie einen Aspekt mit diesem Dienstprogramm, um dies zu tun, selbst mit weniger code.
Ausweitung des Ansatzes discusssed schon, wie wäre es mit etwas wie diesem (keine IDE, die auf diesem netbook, also betrachten Sie dies als pseudocode...)
Eine Sache, die ich hinzufügen möchte. Die meisten Ausnahmen (99.999%) bedeuten, gibt es etwas sehr falsch mit Ihrem code oder die Umgebung, die Anforderungen an admins Aufmerksamkeit. Wenn Ihr code kann nicht mit der Datenbank verbinden, ist es wahrscheinlich eine falsch konfigurierte Umgebung gibt es wenig Punkt zu wiederholen es, nur um herauszufinden, es hat nicht funktioniert, die 3., 4. oder 5. mal entweder. Wenn Sie eine Ausnahme auslösen, weil die person nicht geben Sie eine gültige Kreditkarten-Nummer, Wiederholung nicht magisch auszufüllen, die Nummer der Kreditkarte.
Nur Situationen, die aus der Ferne lohnt sich zu wiederholen ist, wenn ein system ist enorm angespannt und die Dinge sind timing, aber in diesem Fall wiederholen Sie die Logik ist wahrscheinlich, verursachen mehr Belastung als weniger (3x für 3 Wiederholungen für jede Transaktion). Aber das ist, was die Systeme tun, um wieder nach unten Nachfrage (siehe die apollo-lander-mission Geschichte). Wenn ein system ist gefragt, mehr zu tun, als es kann, beginnt es fallen Arbeitsplätze und die timeouts sind das signal das system ist angespannt (oder schlecht geschrieben). Sie wären in einer viel besseren situation, wenn Sie nur erhöht die Kapazität des Systems (hinzufügen von mehr ram, größere Server, mehr Server, bessere algorithmen skalieren!).
Die andere situation wäre, wenn Sie das optimistische sperren und kann man das irgendwie wiederherstellen und automatische Zusammenführen von zwei Versionen eines Objekts. Ich habe zwar gesehen, dies vor, ich würde vorsichtig mit diesem Ansatz, aber es könnte getan werden, für einfache Objekte, die zusammengefasst werden können, ohne Konflikte 100% der Zeit.
Meisten Ausnahmen Logik sollte fangen auf der entsprechenden Ebene (sehr wichtig), stellen Sie sicher, dass Ihr system ist in einem guten konsistenten Zustand (dh rollback Transaktionen, Dateien schließen, etc), log-it, informieren Sie die Benutzer hat es nicht funktioniert.
Aber ich werde humor dieser Idee und versuchen Sie eine gute Grundlage (auch weil es Spaß macht gerne Kreuzworträtsel, puzzle-Spaß).