Dieser Artikel untersucht hauptsächlich die detaillierte Erläuterung der Beispiele für Java -Programmiermechanismus -Wiederholungsmechanismus und teilte relevante Code -Beispiele. Der Herausgeber hält es für ziemlich gut und hat einen gewissen Referenzwert. Freunde, die es brauchen, können sich darauf beziehen.
Eine Funktion muss in der Anwendung implementiert werden: Die Daten müssen in den Remote -Speicherdienst hochgeladen werden, und andere Vorgänge werden ausgeführt, wenn die Rückgabeverarbeitung erfolgreich ist. Diese Funktion ist nicht kompliziert und in zwei Schritte unterteilt: Der erste Schritt besteht darin, den Remote -REST -Service -Logik -Wrapper aufzurufen, um das Verarbeitungsergebnis an die Verarbeitungsmethode zurückzugeben. Der zweite Schritt besteht darin, das Ergebnis des ersten Schritts zu erhalten oder die Ausnahme zu fangen. Wenn ein Fehler oder eine Ausnahme auftritt, wird die Upload -Logik erneut verfälscht, andernfalls wird der logische Betrieb fortgesetzt.
Basierend auf der normalen Upload -Logik wird die Funktionslogik ausgeführt, indem beurteilt wird, ob das Rückgabeergebnis oder das Anhören der Ausnahmentscheidung wiederholt werden. Gleichzeitig wird die Funktionslogik für eine bestimmte Verzögerungszeit erneut ausgesetzt, um die ungültige Ausführung der sofortigen Wiederholung (unter der Annahme, dass die Ausnahme durch externe Ausführungsinstabilität verursacht wird).
public void CommonRetry (MAP <String, Object> Datamap) löscht InterruptedException {map <String, Objekt> parammap = maps.newhashMap (); parammap.put ("tableName", "creativeTable"); Parammap.put ("DS", "20160220"); Parammap.put ("Datamap", Datamap); boolescher Ergebnis = falsch; try {result = uploadToodps (parammap); if (! result) {thread.sleep (1000); UploadToodps (Parammap); // Versuchen Sie einmal}} catch (Ausnahme E) {Thread.sleep (1000); UploadToodps (Parammap); // Versuchen Sie es einmal}}Die obige Lösung kann für Wiederholung immer noch ungültig sein. Um dieses Problem zu lösen, versuchen Sie, das Intervall der Wiederholung und Wiederholung des Intervalls zu erhöhen, um die Möglichkeit zu erreichen, den Wiederholungsgültig zu erhöhen.
public void CommonRetry (MAP <String, Object> Datamap) löscht InterruptedException {map <String, Objekt> parammap = maps.newhashMap (); parammap.put ("tableName", "creativeTable"); Parammap.put ("DS", "20160220"); Parammap.put ("Datamap", Datamap); boolescher Ergebnis = falsch; try {result = uploadToodps (parammap); if (! result) {reeuploadToodps (Parammap, 1000L, 10); // Mehrere Wiederholung}} catch (Ausnahme E) {reeuploadtoodps (Parammap, 1000L, 10); // Mehrere Wiederholung}}}} verzögern}}Es gibt ein Problem mit Lösung 1 und Lösung 2: Normale Logik und Wiederholungslogik sind stark gekoppelt. Die Wiederholungslogik beruht sehr stark auf die Ausführungsergebnisse der normalen Logik, und passive Wiederholungsauslöser für die erwarteten Ergebnisse der normalen Logik. Die Grundursache des Wiederholung wird häufig durch die komplexe Logik überwältigt, was zu inkonsistentem Verständnis der Probleme für nachfolgende Operationen und Wartung führen kann. Die Wiederholung ist schwer zu garantieren und förderlich für Betrieb und Wartung nicht, da das Wiederholungsdesign auf normalen logischen Ausnahmen oder Wiederholung der Grundursache der Vermutung beruht.
Gibt es also eine Lösung, die verwendet werden kann, um die normale Logik und die Wiederholung der Logik zu entkoppeln. Die Antwort lautet: Das heißt, ein Wiederholungsinstrument, das auf dem Agenten -Designmuster basiert. Wir versuchen, das entsprechende Tool zu verwenden, um das obige Szenario zu rekonstruieren.
Die spezifische Definition des Befehlsdesignmusters wird nicht erklärt. Der Hauptgrund ist, dass das Befehlsmuster die Schnittstellenbetriebslogik durch Ausführen des Objekts vervollständigen kann, und gleichzeitig wird die interne Einkapselung der Wiederholungslogik den Implementierungsdetails nicht ausgesetzt. Für den Anrufer ist es die Ausführung der normalen Logik und das Erreichen des Ziels der Entkopplung. Weitere Informationen finden Sie in der spezifischen Funktionsinimposition. (Klassendiagrammstruktur)
Iretry stimmt auf die Upload- und Wiederholung der Schnittstelle zu, die ODPSRSRETRY-ähnliche Kapitalisierung der ODPS-Upload-Logik implementiert und gleichzeitig den Wiederholungsmechanismus und den Wiederholungsstrategie verkauft. Verwenden Sie gleichzeitig die Wiederherstellungsmethode, um den Wiederherstellungsvorgang am Ende durchzuführen.
Unser Anruferlogicclient muss nicht auf Wiederholung achten. Es implementiert die Konventionsschnittstellenfunktion über den Return -Retyryer. Gleichzeitig muss Retyryer die Wiederholungslogik reagieren und verarbeiten. Die spezifische Wiederholungsverarbeitung des Retyrer wird an die Real Irtry Interface -Implementierungsklasse Odpsretry übergeben. Durch die Übernahme des Befehlsmodus werden die normale Logik- und Wiederholungslogik elegant getrennt, und gleichzeitig werden die normale Logik- und Wiederholungslogik durch den Aufbau der Rolle der Wiederholer getrennt, sodass Wiederholung eine bessere Skalierbarkeit hat.
Spring-Retry ist ein Open-Source-Toolkit, der derzeit Version 1.1.2.Release erhältlich ist und die Vorlage für die Wiederholung des Betriebs anpasst und Richtlinien für Wiederholung und Fallback-Richtlinien festlegen kann. Gleichzeitig die Ausführungsinstanz wiederholen, um die Sicherheit der Threads zu gewährleisten. Die spezifischen Betriebsbeispiele sind wie folgt:
public void Upload (endgültige Karte <String, Objekt> Karte) löst Ausnahme aus {// Erstellen Sie eine Wiederholungsvorlage -Instanz -RetypryTemplate RetryTemplate = new RetryTemplate (); // Legen Sie die Wiederholungspolitik fest und legen Sie hauptsächlich die Anzahl der Wiederholungen einfacher SimpleeretryPolicy Policy = new SimpleeretryPolicy (3, Sammlungen. <Klasse <? Erweitert Throwable>, Boolean> SingletonMap (Ausnahme.CLASS, TRUE)); // Legen Sie die Richtlinie zur Wiederholung des Fallback -Betriebs fest, hauptsächlich das Wiederholungsintervall FixedBackOffPolicy FixedbackOffPolicy = new Fixbackoffpolicy (); festbackoffpolicy.setbackoffperiod (100); retypryTemplate.setRetryPolicy (Richtlinie); retypryTemplate.setbackoffpolicy (festbackoffpolicy); // RetryCallback erneut die Rückrufinstanz zum Wickeln der normalen Logiklogik, die erste Ausführung und Wiederholung von Ausführung sind all diese logische endgültige RetryCallback <Objekt, Ausnahme> retRyCallback = Neues RetryCallback <Objekt, Ausnahme> () {// // RetyContext Retry Retry Retry Context Convention, Ausnahme von Spring-Try-Tricks. System.out.println ("mach etwas"); Ausnahme E = UploadToodps (MAP); System.out.println (context.getRyCount ()); Wirf e; // auf diesen Punkt besondere Aufmerksamkeit. Die Wurzel des Wiederholung wird durch Ausnahme zurückgegeben}}; // Das Wiederholungsprozess endet normalerweise endet oder erreicht die obere Grenze für Wiederholung. Final RecoveryCallback <Object> RecoveryCallback = new RecoveryCallback <Object> () {öffentliches Objekt wiederherstellen (RetryContext -Kontext) löst die Ausnahme aus {System.out.println ("DO Recovery Operation"); null zurückkehren; }}; Versuchen Sie es mit {// die Ausführung der Methode durch RetyryTemplate ausführen, um die logische Ausführung von retypryTemplate.execute (retryCallback, RecoveryCallback) zu starten; } catch (Ausnahme e) {e.printstacktrace (); }}Nach der Analyse des Fallcodes übernimmt RetyryTemplate die Rolle des Wiederholungspunkts. Es kann SimplyeretryPolicy festlegen (Richtlinien wiederholen, die obere Grenze wiederholen, Wurzelentität wiederholen), festbackOffpolicy (feste Fallback -Richtlinie festlegen, das Zeitintervall für den Wiederholungsfallen festlegen). RetypryTemplate führt Vorgänge durch Ausführung aus, und zwei Klasseninstanzen, RetypryCallback und RecoveryCallback, sind erforderlich, um zwei Klasseninstanzen vorzubereiten. Ersteres entspricht der Wiederholungs -Rückruf -Logikinstanz und wickelt normale Funktionsvorgänge ab. RecoveryCallback implementiert die Wiederherstellungsbetriebsinstanz am Ende des gesamten Ausführungsvorgangs.
Die Ausführung von RetypryTemplate ist thread-sicher, und die Implementierungslogik wird ThreadLocal zum Speichern des RetyryContext-Ausführungskontexts jeder Ausführungsinstanz verwendet.
Obwohl das Spring-Rysie-Tool elegant Wiederholung implementieren kann, gibt es zwei unfreundliche Designs: Eine ist, dass die Wiederholung auf die geworfene Unterklasse beschränkt ist, was darauf hinweist, dass sich der Wiederholung auf eine schnelle funktionale Ausnahmen ausmacht, da das Design-Voraussetzung auf eine Datum des Wiederholungsbereichs stützen möchte, aber der Frühlingsrückrahmen muss gedrückt werden. Ein anderes ist das Assertion -Objekt, das die Root -Ursache wiederholt, die Ausnahme -Ausnahmeinstanz von Dowithretry verwendet, die nicht der Rückgabedesign normaler interner Behauptungen entspricht.
Frühlingswiederholung befürwortet die Wiederholungsmethoden in der Annotation. Die Wiederholungslogik wird synchron ausgeführt. Der "Versagen" des Wiederhols ist auf Throwable abzielen. Wenn Sie feststellen möchten, ob Sie basierend auf einem bestimmten Zustand des Rückgabewerts wiederholen müssen, können Sie möglicherweise nur den Rückgabewert selbst beurteilen und dann explizit eine Ausnahme ausgeben.
Frühlingsabstraktion für den Wiederholung
"Abstract" ist für jeden Programmierer eine notwendige Qualität. Für mich mit mittelmäßigen Qualifikationen gibt es keinen besseren Weg, sich zu verbessern, als hervorragende Quellcodes nachzuahmen und zu verstehen. Dazu schreibe ich seine Kernlogik neu ... Schauen wir uns die Abstraktion von Spring Retys für "Wiederholung" an.
Schnittstelle für Spring Rety Rety.JPG
Das Tool von Guava Retyryer ähnelt der Spring-Retry. Es wickelt normale logische Wiederholung durch Definition der Rolle des Wiederholers. Guava Retyryer hat jedoch eine bessere politische Definition. Auf der Grundlage der Anzahl der Wiederholungszeiten und der Wiederholung der Frequenzsteuerung kann sie mit der erneuten Quelldefinition kompatibel sein, die mehrere Ausnahmen oder benutzerdefinierte Entitätsobjekte unterstützt und die Wiederholungsfunktion mehr Flexibilität ergibt. Guava Retyryer ist ebenfalls mit Thread-Sicherheit. Die Eintragsaufruflogik verwendet die Anrufmethode von java.util.concurrent.callable. Der Beispielcode lautet wie folgt:
public void uploadodps (endgültige Karte <String, Objekt> Karte) {// Wiederholungsbuilder Erstellen Sie einen Wiederholungsinstanz -Wiederholung. Sie können die Wiederholungsquelle einstellen und mehrere Wiederholungsquellen unterstützen. .Retryifexception () .// Setzen Sie die Ausnahme RECYIFRYIFRESULT (Neue Prädikat <boolean> () {// Setzen Sie benutzerdefinierte Segment -Wiederholungsquelle, @Override public boolean anwenden (boolean stata) {// Spezielle Hinweis anwenden. .WithStopstrategy (Stopstrategies.Stopafterattempt (5)) // RETRY REATIVE 5 -mal festlegen, und Sie können auch die Timeout -Zeit für Wiederholung festlegen. java.util.concurrent Ausnahme (e);}}}); } catch (executionException e) {} catch (retryException ex) {}}Analyse des Beispielcode -Prinzips:
Wiederholung ist ein Fabrikschöpfer, der die Wiederholungsquelle anpassen und mehrere Wiederholungsquellen unterstützen kann, die Anzahl der Wiederholungszeiten oder die Wiederholung von Zeitüberschreitungen konfigurieren und das Wartezeitintervall so konfigurieren kann, dass sie eine Return -Retyryer -Instanz erstellen können.
Die Wiederholungsquelle von RetyryerBuilder unterstützt Ausnahme -Ausnahmebobjekte und benutzerdefinierte Assertion -Objekte und wird durch RetryifException und RELYIFRESULT eingestellt. Sie unterstützt mehrere und ist gleichzeitig kompatibel.
Die Konfiguration der Wartezeit und Wiederholungsgrenze von RetyryerBuilder werden mit verschiedenen Richtlinienklassen implementiert, und die Wartezeitfunktionen können unintervale und feste Intervallmodi unterstützen.
Retyryer ist eine Instanz des Retyryer, das die Betriebslogik über die Anrufmethode ausführt und den Wiederholungsquellenbetrieb zusammenfasst.
Elegante Wiederholung der Gemeinsamkeit und Prinzip
Normale und wiederholte elegant entkoppelt, wiederholen Sie, dass bedingte Instanzen oder logische Ausnahmeinstanzen die Medien für die Kommunikation zwischen beiden sind.
Stimmen Sie auf Wiederholungsintervalle, differentielle Wiederholungsstrategien und feste Zeitüberschreitungszeit fest, um die Effektivität des Wiederholung und die Stabilität des Wiederholungsprozesses weiter zu gewährleisten.
Alle verwenden das Befehlsdesignmuster, und die entsprechenden logischen Operationen werden durch Delegieren des Wiederholungsobjekts abgeschlossen, und die Wiederholungslogik wird intern implementiert.
Spring-Tryer- und Guava-Tryer-Tools sind beide Thread-Safe-Wiederholung und können die Richtigkeit der Wiederholung der Logik in gleichzeitigen Geschäftsszenarien unterstützen.
Anwendbare Szenarien für die Wiederholung anmutig
In der funktionalen Logik gibt es instabile Abhängigkeitsszenarien, und es ist erforderlich, Wiederholung zu verwenden, um das erwartete Ergebnis zu erhalten oder zu versuchen, die Logik erneut auszusetzen, ohne sofort zu enden. Zum Beispiel den Zugriff der Remote -Schnittstelle, Datenlastzugriff, Daten -Upload -Überprüfung von Daten usw.
Es gibt Szenarien, die für Ausnahmeberechnung wiedergegeben werden müssen, und gleichzeitig wird gehofft, die normale Logik und die Wiederholungslogik zu entkoppeln.
Für Interaktionen, die auf Data -Medien basieren, können auch Wiederholungssysteme in Szenarien berücksichtigt werden, bei denen die Ausführungslogik wiederholt werden muss.
Das obige ist die detaillierte Erklärung des Beispiels für das Wiederholungsmechanismus von Java -Programmierung. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!