Die Frühlingswiederholung ist eine Energiefunktion, die unabhängig von der Federstapel ist, die hauptsächlich Wiederholung und Sicherung implementiert. Es gibt Szenariobeschränkungen für den Wiederholung, und nicht alle Szenarien sind für den Wiederholung geeignet, wie z. B. illegale Parameterüberprüfung, Schreibvorgänge usw. (Sie müssen überlegen, ob das Schreiben idempotent ist) sind nicht zum Wiederholung geeignet. Remote Call Timeout oder Netzwerkunterbrechung kann erneut gehalten werden. Im MicroService Governance -Framework verfügt es normalerweise über eine eigene Wiederholung und Zeitlimitkonfiguration. Zum Beispiel kann Dubbo Retries = 1 festlegen, Timeout = 500 Anruf fällt und nur einmal wiederholen. Aufruf fällt fehl, wenn es nach mehr als 500 ms nicht zurückgibt. Im Frühjahrs -Wiederholung können Sie die Art der Ausnahme angeben, die wiederholt werden muss, und das Intervall für jeden Wiederholung festlegen und wenn der Wiederholung fehlschlägt, ob er erneut weitermacht oder verschmilzt (Stop -Wiederholung).
Design und Implementierung
RetryOperations definiert die Wiederholungs -API. RetryTemplate ist die Vorlagenmodus -Implementierung der API, die das Wiederholungs- und Schaltungsunterbrechung implementiert. Die bereitgestellte API lautet wie folgt:
öffentliche Schnittstelle Retyryoperations {<t, E erweitert Throwable> T Execute (retrycallback <t, e> retryCallback) aus. } // andere APIs wurden weggelassen RetryCallback definiert den Vorgang, der durchgeführt werden muss. Nach der Definition der Operation ist es die Frage, wie sie wiederholen können. RetryTemplate führt die Logik aus, wie sie nachlassen, indem verschiedene Wiederholungsstrategien formuliert werden. Die Standard -Wiederholungsstrategie ist SimpleRetryPlicy , was bedeutet, dass sie dreimal wiederholt wird. Wenn der Wiederholung erfolgreich ist, werden Sie es nicht erneut versuchen. Was ist, wenn der 3 -Fuß -Wiederholung fehlgeschlagen ist? Der Prozess endet oder gibt das Bottom-up-Ergebnis zurück. Um das Bottom-up-Ergebnis zurückzugeben, müssen Sie RecoveyCallBack konfigurieren. Aus dem Namen können Sie feststellen, dass dies eine Bottom-up-Callback-Schnittstelle ist, die die Ausführungslogik ist, nachdem der Wiederholung fehlgeschlagen ist. Zusätzlich zu SimpleRetryPolicy gibt es andere Wiederholungsstrategien. Werfen wir einen Blick auf die RetryPolicy -Schnittstelle:
öffentliche Schnittstelle Retypolicy erweitert serialisierbar {boolean canretry (RetryContext -Kontext); RetryContext Open (RetryContext Parent); void schließen (RetyryContext -Kontext); void RegisterTrowable (RetryContext -Kontext, Throwable Throwable);} canRetry wird jedes Mal aufgerufen, wenn Sie es erneut versuchen. Die Urteilsbedingung, ob Sie es weiterhin erneut versuchen können
Vor dem Start des open Wiederholung wird ein Wiederholungskontext für RetryContext erstellt, und der Wiederholungsstapel wird gespeichert.
registerThrowable wird jedes Mal aufgerufen, wenn die Ausnahme erneut abgerufen wird (es gibt eine Ausnahme und wird weiterhin wiederholen)
Nehmen Sie als Beispiel SimpleRetryPolicy . Wenn die Anzahl der Wiederholungen 3 erreicht (Standardeinstellung 3 -mal), hören Sie auf, die Wiederholung abzusetzen, und die Anzahl der Wiederholungen wird im Wiederholungskontext gespeichert.
Geben Sie die folgende Umsetzung der Wiederholungsstrategie an:
Wiederholung der Fallback -Strategie bezieht sich darauf, ob jeder Wiederholung sofort wiedergegeben wird, oder warten Sie eine Weile, bevor Sie es erneut versuchen. Standardmäßig müssen Sie die Backoff BackoffRetryPolicy angeben, wenn Sie eine Wartezeit konfigurieren und dann erneut versuchen müssen. BackoffretryPolicy hat die folgende Implementierung:
Staatlicher Wiederholung oder staatenloser Wiederholung
Der sogenannte staatenlose Wiederholung bezieht sich auf das in einem Thread-Kontext abgeschlossene Wiederholung. Andernfalls ist es staatlicher Wiederholung, wenn das Wiederieren in einem Thread -Kontext nicht abgeschlossen ist. Die vorherige SimpleRetryPolicy war ein staatenloser Wiederholung, da die Wiederholung in einer Schleife abgeschlossen wurde. Was passiert also danach oder muss in einem Staat wiederholt werden? Es gibt normalerweise zwei Situationen: Transaktionsrollback und Leistungsschalter.
DataAccessException ist außergewöhnlich. Wiederholung kann nicht durchgeführt werden, aber wenn andere Ausnahmen geworfen werden, können Sie es erneut versuchen.
Sicherung bedeutet, dass sie in der aktuellen Schleife nicht wiederhergestellt werden, sondern um den globalen Wiederholungsmodus (nicht im Thread -Kontext). Der Leistungsschalter wird aus der Schleife springen, und die Stapelinformationen des Thread -Kontextes gehen unweigerlich verloren. Dann ist es definitiv notwendig, diese Informationen in einem "globalen Modus" zu speichern. Die aktuelle Implementierung wird in einem Cache (MAP -Implementierung) platziert. Sie können es weiterhin erneut versuchen, nachdem Sie ihn das nächste Mal aus dem Cache erhalten haben.
Schneller Start
Verwenden Sie @EnableRetry in der Klasse, die wiederholt werden muss. Wenn proxyTargetClass=true festgelegt ist, wird CGGLIB Dynamic Proxy verwendet:
@Configuration@enableretry (proxytargetClass = true) @ComponentPublic Class RetryExamples {} Wiederholung aufgrund der maximalen Anzahl von Retries-Strategien, wenn der Wiederholung dreimal wiederholt wird und die Ausnahme noch ausgelöst wird, wird der Wiederholung gestoppt und der Bottom-up-Rückruf wird ausgeführt. Daher ist das endgültige Ausgabeergebnis Integer.MAX_VALUE :
private void retryExample3 () löst Ausnahme aus {retypryTemplate retryTemplate = new RetryTemplate (); SimpleeretryPolicy SimpleeretryPolicy = new SimpleeretryPolicy (); SimpleeretryPolicy.SetMaxattemuts (3); retypryTemplate.setRetryPolicy (simimedetrypolicy); Integer result = retryTemplate.execute (neuer RetryCallback <Integer, Exception> () {int i = 0; // Wiederholung der Operation @Override public Integer Dowithrse (retryContext retryContext) Ausnahme {log.info ("RetryContext RetryContext) Ausnahme {log.info (" retrycontext; }, neuer RecoveryCallback <Gladeger> () {// Basisrückruf @Override public Integer recover (retrycontext retrycontext) Ausnahme {log.info ("Nach dem Wiederholung: {}, Wiederherstellungsmethode namens! log.info ("Endergebnis: {}", Ergebnis); } private int len (int i) löst Ausnahme aus {if (i <10) neue Ausnahme (i + "le 10"); kehre I zurück; }Im Folgenden wird beschrieben, wie der Richtlinienmodus des Richtlinienmodus des Leistungsschalters (CircuitBreakretryPolicy) verwendet wird. Die folgenden drei Parameter müssen festgelegt werden:
Leistungsschalter Öffnung und Schlussurteil:
Der Testcode lautet wie folgt:
RetypryTemplate template = new retryTemplate (); CircuitBreakretryPolicy Retypolicy = New CircuitBreakretryPolicy (neue simimleeretrypolicy (3)); retypolicy.setopentimeout (5000); retypolicy.setResettimeout (20000); template.setRetryPolicy (Retypolicy); für (int i = 0; i <10; i ++) {//Thread.sleep(100); try {Object key = "Circuit"; boolean isforcerefresh = false; Wiedererlangen state = new DefaultretryState (Schlüssel, isforCereFresh); String result = template.execute (neuer retrycallback <string, runTimeexception> () {@Override public String DowithRetry (RetryContext -Kontext) löst RunTimeexception {log.info ("Wiederholung der Zählung {}", context.getRyCount (). @Override public String recover (retryContext context) löst Ausnahme {return "Standard"; log.info ("Ergebnis: {}", Ergebnis); } catch (Ausnahme e) {System.out.println (e); }} Da isForceRefresh = false festgelegt ist, wird der Wert von key = "circuit" (dh RetyryContext) aus dem Cache erhalten. Wenn der Wiederholung fehlschlägt und this.time < this.openWindow ist fusioniert, können Sie im globalen Modus weiterhin wiederholt werden ( RetryContext ist dieselbe).
Annotationsentwicklung
Wenn das Schreiben einer RetryTemplate jedes Mal, wenn Sie eine Wiederholungsanforderung haben, zu aufgebläht sind, kann die Verwendung von Anmerkungen die Entwicklung erheblich vereinfachen und den doppelten Code reduzieren. Hier finden Sie eine Wiederholung der maximalen Wiederholungsstrategie, die mit Annotationen implementiert wird:
@Retryable (value = sqldataException.class, backoff = @backoff (value = 0l)) public String service3 () löst sqldataException {log.info ("service3 open") aus; neue sqldataException () werfen; } @Recover public String recover (sqldataException ne) {return "sqldataException recover"; }Anmerkungen umfassen:
@Enableretry
@Retryable
@Genesen
@Backoff
@Circuitbreaker
@Enableretry: Kannst du es noch einmal versuchen? Wenn die Eigenschaft der ProxytargetClass -Eigenschaft wahr ist (Standardfehler), verwenden Sie CGGLIB Proxy
@Retyable: Die Methode, die Annotation wiederholt
@Backoff: Wiederholen Sie die Fallback -Strategie (versuchen Sie es jetzt oder warten Sie eine Weile, bevor Sie es erneut versuchen)
@Recover: Zur Verwendung mit Methoden. Wird als "garantierte" Methode verwendet, wenn @Retryable fehlschlägt. Die Methode der @Recover -Annotation muss mit der Methode "Signatur" von @Retryable Annotation übereinstimmen. Der erste Eintragsparameter ist die Ausnahme, die wiederholt werden soll. Andere Parameter stimmen mit @Retryable überein. Der Rückgabewert muss der gleiche sein, sonst kann er nicht ausgeführt werden!
@Circuitbreaker: Wird für die Methode verwendet, implementieren Sie den Schaltungsunterbrechungsmodus.
Weitere Beispiele erhalten Sie in meinem Stern in meinem Github (https://github.com/happyxiaofan/springboot-learning-plample). Danke
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.