Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Wiederholen fehlgeschlagener Aktivitäten
Gelegentlich schlagen Aktivitäten aus temporären Gründen fehl, z. B. aufgrund eines vorübergehenden Verbindungsverlusts. In anderen Fällen wird die Aktivität möglicherweise erfolgreich durchgeführt, daher besteht das geeignete Verfahren zum Umgang mit dem Aktivitätsfehler häufig im (ggf. mehrmaligen) Wiederholen der Aktivität.
Es gibt verschiedene Strategien zum Wiederholen von Aktivitäten. Welche am besten geeignet ist, hängt von den Details in Ihrem Workflow ab. Die Strategien lassen sich grundsätzlich in drei Kategorien einteilen:
-
Die retry-until-success Strategie wiederholt die Aktivität einfach so lange, bis sie abgeschlossen ist.
-
Die exponentielle Wiederholungsstrategie verlängert das Zeitintervall zwischen den Versuchen exponentiell, bis die Aktivität abgeschlossen wird oder der Vorgang eine bestimmte Stoppmarke erreicht, beispielsweise eine maximale Anzahl an Versuchen.
-
Die benutzerdefinierte Wiederholungsstrategie legt fest, ob und wie die Aktivität nach einem fehlgeschlagenen Versuch wiederholt wird.
In den folgenden Abschnitten wird die Implementierung dieser Strategien beschrieben. In diesem Beispiel nutzen die Workflow-Worker alle eine einzige Aktivität, unreliableActivity, die willkürlich eine der folgenden Verhaltensweisen zeigt:
-
Wird umgehend abgeschlossen
-
Schlägt beabsichtigt fehl durch Überschreiten des Timeout-Wertes
-
Schlägt beabsichtigt fehl durch Ausgeben von
IllegalStateException
Retry-Until-Success Strategie
Die einfachste Wiederholungsstrategie besteht darin, die Aktivität nach jedem Fehler zu wiederholen, bis sie schließlich erfolgreich durchgeführt werden kann. Das grundlegende Muster ist:
-
Implementieren Sie eine verschachtelte
TryCatch- oderTryCatchFinally-Klasse in die Eintrittspunktmethode Ihres Workflows. -
Führen Sie die Aktivität in
doTryaus. -
Falls die Aktivität fehlschlägt, ruft das Framework
doCatchauf, wodurch die Eintrittspunktmethode erneut ausgeführt wird. -
Wiederholen Sie die Schritte 2 bis 3, bis die Aktivität erfolgreich abgeschlossen wird.
Der folgende Workflow implementiert die retry-until-success Strategie. Die Workflow-Schnittstelle wird in RetryActivityRecipeWorkflow implementiert und enthält die Methode runUnreliableActivityTillSuccess, die den Eintrittspunkt des Workflows darstellt. Der Workflow-Worker wird in RetryActivityRecipeWorkflowImpl wie folgt implementiert:
public class RetryActivityRecipeWorkflowImpl implements RetryActivityRecipeWorkflow { @Override public void runUnreliableActivityTillSuccess() { final Settable<Boolean> retryActivity = new Settable<Boolean>(); new TryCatch() { @Override protected void doTry() throws Throwable { Promise<Void> activityRanSuccessfully = client.unreliableActivity(); setRetryActivityToFalse(activityRanSuccessfully, retryActivity); } @Override protected void doCatch(Throwable e) throws Throwable { retryActivity.set(true); } }; restartRunUnreliableActivityTillSuccess(retryActivity); } @Asynchronous private void setRetryActivityToFalse( Promise<Void> activityRanSuccessfully, @NoWait Settable<Boolean> retryActivity) { retryActivity.set(false); } @Asynchronous private void restartRunUnreliableActivityTillSuccess( Settable<Boolean> retryActivity) { if (retryActivity.get()) { runUnreliableActivityTillSuccess(); } } }
Der Workflow funktioniert folgendermaßen:
-
runUnreliableActivityTillSuccesserstellt einSettable<Boolean>-Objekt namensretryActivity, das verwendet wird, um anzugeben, ob die Aktivität fehlgeschlagen ist und erneut getestet werden sollte.Settable<T>ist vonPromise<T>abgeleitet und funktioniert zwar ähnlich, jedoch legen Sie den Wert einesSettable<T>-Objekts manuell fest. -
runUnreliableActivityTillSuccessimplementiert eine anonyme verschachtelteTryCatch-Klasse zur Verarbeitung von Ausnahmen, die von derunreliableActivity-Aktivität ausgegeben werden. Weitere Informationen zum Umgang mit Ausnahmen, die von asynchronem Code ausgegeben werden, finden Sie unter Fehlerbehandlung. -
doTryführt dieunreliableActivity-Aktivität aus, die einPromise<Void>-Objekt namensactivityRanSuccessfullyzurückgibt. -
doTryruft die asynchronesetRetryActivityToFalse-Methode auf, die zwei Parameter umfasst:-
activityRanSuccessfullyübernimmt dasPromise<Void>-Objekt, das von derunreliableActivity-Aktivität zurückgegeben wird. -
retryActivityübernimmt dasretryActivity-Objekt.
Bei Abschluss von
unreliableActivitywirdactivityRanSuccessfullyeinsatzbereit undsetRetryActivityToFalselegtretryActivityauf "false" fest. Andernfalls wirdactivityRanSuccessfullynicht einsatzbereit undsetRetryActivityToFalsewird nicht ausgeführt. -
-
Wenn
unreliableActivityeine Ausnahme ausgibt, ruft das FrameworkdoCatchauf und übergibt es an das Ausnahmeobjekt.doCatchlegtretryActivityauf "true" fest. -
runUnreliableActivityTillSuccessruft die asynchronerestartRunUnreliableActivityTillSuccess-Methode auf und übergibt ihr dasretryActivity-Objekt. DaretryActivityeinPromise<T>-Typ ist, verschiebtrestartRunUnreliableActivityTillSuccessdie Ausführung, bisretryActivityeinsatzbereit ist. Dies ist der Fall, sobaldTryCatchabgeschlossen wird. -
Wenn
retryActivityeinsatzbereit ist, extrahiertrestartRunUnreliableActivityTillSuccessden Wert.-
Wenn der Wert
falseist, war die Wiederholung erfolgreich.restartRunUnreliableActivityTillSuccessunternimmt nichts und die Wiederholungssequenz wird beendet. -
Wenn als Wert "true" ausgegeben wird, ist der Wiederholungsversuch fehlgeschlagen.
restartRunUnreliableActivityTillSuccessruftrunUnreliableActivityTillSuccessauf, um die Aktivität erneut auszuführen.
-
-
Die Schritte 1 bis 7 werden wiederholt, bis
unreliableActivityabgeschlossen wird.
Anmerkung
doCatch verarbeitet die Ausnahme nicht, sondern legt nur das retryActivity-Objekt auf "true" fest, um anzugeben, dass die Aktivität fehlgeschlagen ist. Die Wiederholung wird von der asynchronen restartRunUnreliableActivityTillSuccess-Methode verarbeitet, die die Ausführung verschiebt, bis TryCatch abgeschlossen wird. Der Grund für diesen Ansatz ist, dass Sie eine Aktivität, die Sie in doCatch wiederholen, nicht beenden können. Wenn die Aktivität in restartRunUnreliableActivityTillSuccess wiederholt wird, können Sie Aktivitäten ausführen, die sich beenden lassen.
Exponentielle Wiederholungsstrategie
Bei der exponentiellen Wiederholungsstrategie führt das Framework eine fehlgeschlagene Aktivität nach einem festgelegten Zeitraum (N Sekunden) erneut aus. Schlägt dieser Versuch fehl, wiederholt das Framework die Aktivität nach 2N Sekunden, dann nach 4N Sekunden usw. Da die Wartezeit sehr lang werden kann, werden Sie die Wiederholungen nicht endlos fortsetzen, sondern den Vorgang irgendwann beenden.
Das Framework bietet drei Möglichkeiten zur Implementierung einer exponentiellen Wiederholungsstrategie:
-
Die
@ExponentialRetry-Anmerkung ist der einfachste Ansatz. Sie müssen die Wiederholungsoptionen jedoch bei der Kompilierung festlegen. -
Die
RetryDecorator-Klasse ermöglicht es Ihnen, die Wiederholungskonfiguration zur Laufzeit festzulegen und bei Bedarf zu ändern. -
Die
AsyncRetryingExecutor-Klasse ermöglicht es Ihnen, die Wiederholungskonfiguration zur Laufzeit festzulegen und bei Bedarf zu ändern. Darüber hinaus ruft das Framework eine vom Benutzer implementierteAsyncRunnable.run-Methode zur Ausführung jedes neuen Versuchs auf.
Alle Ansätze unterstützen folgende Konfigurationsoptionen, wobei die Werte für die Zeit in Sekunden angegeben werden:
-
Die erste Wiederholungswartezeit.
-
Den Backoff-Koeffizienten, der verwendet wird, um die Wiederholungsintervalle folgendermaßen zu errechnen:
retryInterval = initialRetryIntervalSeconds * Math.pow(backoffCoefficient, numberOfTries - 2)Der Standardwert lautet 2.0.
-
Die maximale Anzahl an Wiederholungen. Der Standardwert ist unbegrenzt.
-
Das maximale Wiederholungsintervall. Der Standardwert ist unbegrenzt.
-
Die Ablaufzeit. Es werden keine Wiederholungen mehr ausgeführt, wenn die Gesamtdauer des Vorgangs diesen Wert übersteigt. Der Standardwert ist unbegrenzt.
-
Die Ausnahmen, die den Wiederholungsvorgang auslösen. Standardmäßig löst jede Ausnahme den Wiederholungsvorgang aus.
-
Die Ausnahmen, die keinen Wiederholungsvorgang auslösen. Standardmäßig sind keine Ausnahmen ausgeschlossen.
In den folgenden Abschnitten werden die verschiedenen Methoden zur Implementierung einer exponentiellen Wiederholungsstrategie beschrieben.
Exponentieller Wiederholungsversuch mit @ ExponentialRetry
Die einfachste Möglichkeit zur Implementierung einer exponentiellen Wiederholungsstrategie für eine Aktivität ist die Anwendung einer @ExponentialRetry -Anmerkung auf die Aktivität in der Schnittstellendefinition. Schlägt die Aktivität fehl, verarbeitet das Framework den Wiederholungsvorgang automatisch basierend auf den festgelegten Optionen. Das grundlegende Muster ist:
-
Wenden Sie
@ExponentialRetryauf die entsprechenden Aktivitäten an und legen Sie die Wiederholungskonfiguration fest. -
Schlägt eine mit einer Anmerkung versehene Aktivität fehl, wiederholt das Framework die Aktivität automatisch basierend auf der durch die Anmerkungsargumente festgelegten Konfiguration.
Der ExponentialRetryAnnotationWorkflow-Workflow-Worker implementiert die exponentielle Wiederholungsstrategie durch Verwendung einer @ExponentialRetry-Anmerkung. Er verwendet eine unreliableActivity-Aktivität, deren Schnittstellendefinition wie folgt in ExponentialRetryAnnotationActivities implementiert wird:
@Activities(version = "1.0") @ActivityRegistrationOptions( defaultTaskScheduleToStartTimeoutSeconds = 30, defaultTaskStartToCloseTimeoutSeconds = 30) public interface ExponentialRetryAnnotationActivities { @ExponentialRetry( initialRetryIntervalSeconds = 5, maximumAttempts = 5, exceptionsToRetry = IllegalStateException.class) public void unreliableActivity(); }
Die @ExponentialRetry-Optionen legen folgende Strategie fest:
-
Nur wiederholen, wenn die Aktivität
IllegalStateExceptionausgibt. -
Eine erste Wartezeit von 5 Sekunden verwenden.
-
Nicht mehr als 5 Wiederholungen.
Die Workflow-Schnittstelle wird in RetryWorkflow implementiert und enthält die Methode process, die den Eintrittspunkt des Workflows darstellt. Der Workflow-Worker wird in ExponentialRetryAnnotationWorkflowImpl wie folgt implementiert:
public class ExponentialRetryAnnotationWorkflowImpl implements RetryWorkflow { public void process() { handleUnreliableActivity(); } public void handleUnreliableActivity() { client.unreliableActivity(); } }
Der Workflow funktioniert folgendermaßen:
-
processführt die synchronehandleUnreliableActivity-Methode aus. -
handleUnreliableActivityführt dieunreliableActivity-Aktivität aus.
Schlägt die Aktivität fehl, indem IllegalStateException ausgegeben wird, führt das Framework automatisch die in ExponentialRetryAnnotationActivities festgelegte Wiederholungsstrategie aus.
Exponentielle Wiederholung mit der Klasse RetryDecorator
@ExponentialRetry ist benutzerfreundlich. Allerdings ist die Konfiguration statisch und wird bei der Kompilierung festgelegt, sodass das Framework bei jedem Fehler der Aktivität dieselbe Wiederholungsstrategie anwendet. Sie können eine flexiblere exponentielle Wiederholungsstrategie implementieren, indem Sie die RetryDecorator-Klasse verwenden, mit der Sie die Konfiguration zur Laufzeit festlegen und bei Bedarf ändern können. Das grundlegende Muster ist:
-
Erzeugen und konfigurieren Sie ein
ExponentialRetryPolicy-Objekt, das die Wiederholungskonfiguration festlegt. -
Erzeugen Sie ein
RetryDecorator-Objekt und geben Sie dasExponentialRetryPolicy-Objekt aus Schritt 1 an den Konstruktor weiter. -
Wenden Sie das Decorator-Objekt auf die Aktivität an, indem Sie den Klassennamen des Aktivitäts-Clients auf die Ausstattungsmethode des
RetryDecorator-Objekts übergeben. -
Führen Sie die Aktivität aus.
Schlägt die Aktivität fehl, wiederholt das Framework die Aktivität basierend auf der ExponentialRetryPolicy-Objektkonfiguration. Sie können die Wiederholungskonfiguration bei Bedarf ändern, indem Sie dieses Objekt anpassen.
Anmerkung
Die @ExponentialRetry-Anmerkung und die RetryDecorator-Klasse schließen sich gegenseitig aus. Sie können RetryDecorator nicht verwenden, um eine Wiederholungsrichtlinie, die von einer @ExponentialRetry-Anmerkung festgelegt wird, dynamisch zu überschreiben.
Die folgende Workflow-Implementierung zeigt, wie die RetryDecorator-Klasse verwendet wird, um eine exponentielle Wiederholungsstrategie zu implementieren. Sie verwendet eine unreliableActivity-Aktivität, die nicht über eine @ExponentialRetry-Anmerkung verfügt. Die Workflow-Schnittstelle wird in RetryWorkflow implementiert und enthält die Methode process, die den Eintrittspunkt des Workflows darstellt. Der Workflow-Worker wird in DecoratorRetryWorkflowImpl wie folgt implementiert:
public class DecoratorRetryWorkflowImpl implements RetryWorkflow { ... public void process() { long initialRetryIntervalSeconds = 5; int maximumAttempts = 5; ExponentialRetryPolicy retryPolicy = new ExponentialRetryPolicy( initialRetryIntervalSeconds).withMaximumAttempts(maximumAttempts); Decorator retryDecorator = new RetryDecorator(retryPolicy); client = retryDecorator.decorate(RetryActivitiesClient.class, client); handleUnreliableActivity(); } public void handleUnreliableActivity() { client.unreliableActivity(); } }
Der Workflow funktioniert folgendermaßen:
-
processerzeugt und konfiguriert einExponentialRetryPolicy-Objekt folgendermaßen:-
Das erste Wiederholungsintervall wird an den Konstruktor übergeben.
-
Aufrufen der
withMaximumAttempts-Methode des Objekts, um die maximale Anzahl der Versuche auf 5 festzulegen.ExponentialRetryPolicyzeigt anderewith-Objekte an, mit denen Sie andere Konfigurationsoptionen angeben können.
-
-
processerzeugt einRetryDecorator-Objekt namensretryDecoratorund übergibt dasExponentialRetryPolicy-Objekt aus Schritt 1 an den Konstruktor. -
processwendet den Decorator auf die Aktivität an, indem es dieretryDecorator.decorate-Methode aufruft und ihr den Klassennamen des Aktivitäts-Clients übergibt. -
handleUnreliableActivityführt die Aktivität aus.
Schlägt die Aktivität fehl, wiederholt das Framework sie basierend auf der in Schritt 1 festgelegten Konfiguration.
Anmerkung
Einige with-Methoden der ExponentialRetryPolicy-Klasse besitzen eine entsprechende set-Methode, die Sie jederzeit aufrufen können, um die entsprechende Konfigurationsoption anzupassen: setBackoffCoefficient, setMaximumAttempts, setMaximumRetryIntervalSeconds und setMaximumRetryExpirationIntervalSeconds.
Exponentielle Wiederholung mit der Klasse AsyncRetryingExecutor
Die RetryDecorator-Klasse bietet mehr Flexibilität bei der Konfiguration des Wiederholungsvorgangs als @ExponentialRetry, allerdings führt das Framework dennoch automatisch die Wiederholungen basierend auf der aktuellen Konfiguration des ExponentialRetryPolicy-Objekts aus. Ein flexiblerer Ansatz ist die Verwendung der AsyncRetryingExecutor-Klasse. Sie haben nicht nur die Möglichkeit, den Wiederholungsvorgang zur Laufzeit zu konfigurieren, sondern das Framework ruft zudem eine vom Benutzer implementierte AsyncRunnable.run-Methode zur Ausführung jeder Wiederholung auf, statt die Aktivität einfach auszuführen.
Das grundlegende Muster ist:
-
Erzeugen und konfigurieren Sie ein
ExponentialRetryPolicy-Objekt, um die Wiederholungskonfiguration festzulegen. -
Erzeugen Sie ein
AsyncRetryingExecutor-Objekt und übergeben Sie ihm dasExponentialRetryPolicy-Objekt und eine Instanz der Workflow-Uhr. -
Implementieren Sie eine anonyme verschachtelte
TryCatch- oderTryCatchFinally-Klasse. -
Implementieren Sie eine anonyme
AsyncRunnable-Klasse und überschreiben Sie dierun-Methode, um den benutzerdefinierten Code zur Ausführung der Aktivität zu implementieren. -
Überschreiben Sie
doTry, um dieexecute-Methode desAsyncRetryingExecutor-Objekts aufzurufen, und übergeben Sie ihr dieAsyncRunnable-Klasse aus Schritt 4. DasAsyncRetryingExecutor-Objekt ruftAsyncRunnable.runauf, um die Aktivität auszuführen. -
Schlägt die Aktivität fehl, ruft das
AsyncRetryingExecutor-Objekt in Einklang mit der Wiederholungsrichtlinie, die in Schritt 1 festgelegt wurde, dieAsyncRunnable.run-Methode erneut auf.
Der folgende Workflow zeigt, wie die AsyncRetryingExecutor-Klasse verwendet wird, um eine exponentielle Wiederholungsstrategie zu implementieren. Er verwendet dieselbe unreliableActivity-Aktivität wie der zuvor behandelte DecoratorRetryWorkflow-Workflow. Die Workflow-Schnittstelle wird in RetryWorkflow implementiert und enthält die Methode process, die den Eintrittspunkt des Workflows darstellt. Der Workflow-Worker wird in AsyncExecutorRetryWorkflowImpl wie folgt implementiert:
public class AsyncExecutorRetryWorkflowImpl implements RetryWorkflow { private final RetryActivitiesClient client = new RetryActivitiesClientImpl(); private final DecisionContextProvider contextProvider = new DecisionContextProviderImpl(); private final WorkflowClock clock = contextProvider.getDecisionContext().getWorkflowClock(); public void process() { long initialRetryIntervalSeconds = 5; int maximumAttempts = 5; handleUnreliableActivity(initialRetryIntervalSeconds, maximumAttempts); } public void handleUnreliableActivity(long initialRetryIntervalSeconds, int maximumAttempts) { ExponentialRetryPolicy retryPolicy = new ExponentialRetryPolicy(initialRetryIntervalSeconds).withMaximumAttempts(maximumAttempts); final AsyncExecutor executor = new AsyncRetryingExecutor(retryPolicy, clock); new TryCatch() { @Override protected void doTry() throws Throwable { executor.execute(new AsyncRunnable() { @Override public void run() throws Throwable { client.unreliableActivity(); } }); } @Override protected void doCatch(Throwable e) throws Throwable { } }; } }
Der Workflow funktioniert folgendermaßen:
-
processruft diehandleUnreliableActivity-Methode auf und übergibt ihr die Konfigurationseinstellungen. -
handleUnreliableActivityverwendet die Konfigurationseinstellungen aus Schritt 1, um dasExponentialRetryPolicy-ObjektretryPolicyzu erzeugen. -
handleUnreliableActivityerzeugt dasAsyncRetryExecutor-Objektexecutorund übergibt dasExponentialRetryPolicy-Objekt aus Schritt 2 und eine Instanz der Workflow-Uhr an den Konstruktor. -
handleUnreliableActivityimplementiert eine anonyme verschachtelteTryCatch-Klasse und überschreibt diedoTry- unddoCatch-Methode, um die Wiederholungen auszuführen und mögliche Ausnahmen zu verarbeiten. -
doTryerzeugt eine anonymeAsyncRunnable-Klasse und überschreibt dierun-Methode, um den benutzerdefinierten Code zur Ausführung vonunreliableActivityzu implementieren. Der Einfachheit halber führtrunnur die Aktivität aus, Sie können bei Bedarf jedoch komplexere Ansätze implementieren. -
doTryruftexecutor.executeauf und übergibt es an dasAsyncRunnable-Objekt.executeruft dierun-Methode desAsyncRunnable-Objekts auf, um die Aktivität auszuführen. -
Schlägt die Aktivität fehl, ruft der Executor erneut
runauf, basierend auf der Konfiguration desretryPolicy-Objekts.
Weitere Informationen zur Verwendung der TryCatch-Klasse zur Fehlerbehandlung finden Sie unter AWS Flow Framework für Java-Ausnahmen.
Benutzerdefinierte Wiederholungsstrategie
Der flexibelste Ansatz zur Wiederholung fehlgeschlagener Aktivitäten ist eine benutzerdefinierte Strategie, bei der rekursiv eine asynchrone Methode aufgerufen wird, die den Wiederholungsversuch ausführt, ähnlich wie bei der Strategie. retry-until-success Statt die Aktivität einfach erneut auszuführen, implementieren Sie jedoch eine benutzerdefinierte Logik, die entscheidet, ob und wie jede Wiederholung ausgeführt werden soll. Das grundlegende Muster ist:
-
Erzeugen Sie ein
Settable<T>-Statusobjekt, das verwendet wird, um anzugeben, ob die Aktivität fehlgeschlagen ist. -
Implementieren Sie eine verschachtelte
TryCatch- oderTryCatchFinally-Klasse. -
doTryführt die Aktivität aus. -
Schlägt die Aktivität fehl, legt
doCatchdas Statusobjekt fest, um anzugeben, dass die Aktivität fehlgeschlagen ist. -
Rufen Sie eine asynchrone Fehlerbehandlungsmethode auf und übergeben Sie ihr das Statusobjekt. Die Methode verschiebt die Ausführung, bis
TryCatchoderTryCatchFinallyabgeschlossen wird. -
Die Fehlerbehandlungsmethode entscheidet, ob und wann die Aktivität wiederholt werden soll.
Der folgende Workflow zeigt, wie eine benutzerdefinierte Wiederholungsstrategie implementiert wird. Er verwendet dieselbe unreliableActivity-Aktivität wie der DecoratorRetryWorkflow- und AsyncExecutorRetryWorkflow-Workflow. Die Workflow-Schnittstelle wird in RetryWorkflow implementiert und enthält die Methode process, die den Eintrittspunkt des Workflows darstellt. Der Workflow-Worker wird in CustomLogicRetryWorkflowImpl wie folgt implementiert:
public class CustomLogicRetryWorkflowImpl implements RetryWorkflow { ... public void process() { callActivityWithRetry(); } @Asynchronous public void callActivityWithRetry() { final Settable<Throwable> failure = new Settable<Throwable>(); new TryCatchFinally() { protected void doTry() throws Throwable { client.unreliableActivity(); } protected void doCatch(Throwable e) { failure.set(e); } protected void doFinally() throws Throwable { if (!failure.isReady()) { failure.set(null); } } }; retryOnFailure(failure); } @Asynchronous private void retryOnFailure(Promise<Throwable> failureP) { Throwable failure = failureP.get(); if (failure != null && shouldRetry(failure)) { callActivityWithRetry(); } } protected Boolean shouldRetry(Throwable e) { //custom logic to decide to retry the activity or not return true; } }
Der Workflow funktioniert folgendermaßen:
-
processruft die asynchronecallActivityWithRetry-Methode auf. -
callActivityWithRetryerstellt einSettable<Throwable>-Objekt namens "failure" (Fehler), mit dem angezeigt wird, dass die Aktivität fehlgeschlagen ist.Settable<T>ist vonPromise<T>abgeleitet und funktioniert zwar ähnlich, jedoch legen Sie den Wert einesSettable<T>-Objekts manuell fest. -
callActivityWithRetryimplementiert eine anonyme verschachtelteTryCatchFinally-Klasse zur Verarbeitung von Ausnahmen, die vonunreliableActivityausgegeben werden. Weitere Informationen zum Umgang mit Ausnahmen, die von asynchronem Code ausgegeben werden, finden Sie unter AWS Flow Framework für Java-Ausnahmen. -
doTryführtunreliableActivityaus. -
Wenn
unreliableActivityeine Ausnahme auslöst, ruft das FrameworkdoCatchauf und übergibt sie an das Ausnahmeobjekt.doCatchlegtfailureauf das Ausnahmeobjekt fest, was anzeigt, dass die Aktivität fehlgeschlagen ist, und versetzt das Objekt in einen betriebsbereiten Zustand. -
doFinallyüberprüft, obfailureeinsatzbereit ist, was nur der Fall ist, wennfailurevondoCatchfestgelegt wurde.-
Wenn es bereit
failureist, tut es nichts.doFinally -
Wenn
failurenicht einsatzbereit ist, wird die Aktivität abgeschlossen unddoFinallylegt "failure" aufnullfest.
-
-
callActivityWithRetryruft die asynchroneretryOnFailure-Methode auf und übergibt ihr "failure". Da "failure" einSettable<T>-Typ ist, verschiebtcallActivityWithRetrydie Ausführung, bis "failure" einsatzbereit ist. Dies ist der Fall, sobaldTryCatchFinallyabgeschlossen wird. -
retryOnFailureruft den Wert von "failure" ab.-
Wenn der Fehler auf Null gesetzt ist, war der Wiederholungsversuch erfolgreich.
retryOnFailureunternimmt nichts, wodurch der Wiederholungsprozess beendet wird. -
Wenn "failure" auf ein Ausnahmeobjekt festgelegt ist und
shouldRetry"true" zurückgibt, ruftretryOnFailurecallActivityWithRetryauf, um die Aktivität zu wiederholen.shouldRetryimplementiert eine benutzerdefinierte Logik, um zu entscheiden, ob eine fehlgeschlagene Aktivität wiederholt werden soll. Der Einfachheit halber gibtshouldRetryimmertruezurück undretryOnFailureführt die Aktivität sofort aus, Sie können bei Bedarf jedoch eine komplexere Logik implementieren.
-
-
Die Schritte 2—8 werden wiederholt, bis der Vorgang
unreliableActivityabgeschlossen ist odershouldRetrybeendet werden soll.
Anmerkung
doCatch verarbeitet den Wiederholungsvorgang nicht, sondern legt nur "failure" fest, um anzugeben, dass die Aktivität fehlgeschlagen ist. Der Wiederholungsvorgang wird von der asynchronen retryOnFailure-Methode verarbeitet, die die Ausführung verschiebt, bis TryCatch abgeschlossen wird. Der Grund für diesen Ansatz ist, dass Sie eine Aktivität, die Sie in doCatch wiederholen, nicht beenden können. Wenn die Aktivität in retryOnFailure wiederholt wird, können Sie Aktivitäten ausführen, die sich beenden lassen.