Ich muss einige Daten nach dem Benutzer registriert senden. Ich möchte den ersten Versuch im Hauptthread machen, aber wenn es irgendwelche Fehler gibt, möchte ich 5 mal mit 10 Minuten Intervall versuchen.Projekt Reactor async senden E-Mail mit Wiederholung bei Fehler
@Override
public void sendRegisterInfo(MailData data) {
Mono.just(data)
.doOnNext(this::send)
.doOnError(ex -> logger.warn("Main queue {}", ex.getMessage()))
.doOnSuccess(d -> logger.info("Send mail to {}", d.getRecipient()))
.onErrorResume(ex -> retryQueue(data))
.subscribe();
}
private Mono<MailData> retryQueue(MailData data) {
return Mono.just(data)
.delayElement(Duration.of(10, ChronoUnit.MINUTES))
.doOnNext(this::send)
.doOnError(ex -> logger.warn("Retry queue {}", ex.getMessage()))
.doOnSuccess(d -> logger.info("Send mail to {}", d.getRecipient()))
.retry(5)
.subscribe();
}
Es funktioniert. Aber ich habe ein paar Fragen bekommen:
- Haben korrigiere ich Betrieb in
doOnNext
Funktion zu machen? - Ist es korrekt,
delayElement
zu verwenden, um eine Verzögerung zwischen den Ausführungen zu machen? - Wurde der Thread beim Warten auf Verzögerung blockiert?
- Und was ist die beste Praxis, um Wiederholungen bei Fehler zu machen und eine Verzögerung zwischen ihm zu machen?