2017-06-01 2 views
0

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:

  1. Haben korrigiere ich Betrieb in doOnNext Funktion zu machen?
  2. Ist es korrekt, delayElement zu verwenden, um eine Verzögerung zwischen den Ausführungen zu machen?
  3. Wurde der Thread beim Warten auf Verzögerung blockiert?
  4. Und was ist die beste Praxis, um Wiederholungen bei Fehler zu machen und eine Verzögerung zwischen ihm zu machen?

Antwort

1
  1. doOnXXX für die Protokollierung ist in Ordnung. Für die eigentliche Elementverarbeitung müssen Sie jedoch lieber flatMap anstelle von doOnNext verwenden (vorausgesetzt, Ihre Verarbeitung ist asynchron/kann in eine Flux/Mono zurückgegeben werden).

  2. Das ist richtig. Eine andere Möglichkeit ist, den Code umzudrehen und von einem Flux.interval zu starten, aber hier ist delayElement besser IMO.

  3. Die Verzögerung wird in einem separaten Thread/Scheduler ausgeführt (standardmäßig Schedulers.parallel()), sodass der Hauptthread nicht blockiert wird.

  4. Es gibt tatsächlich einen Retry Builder diese Art von Anwendungsfall in der reactor-extra addon gewidmet: https://github.com/reactor/reactor-addons/blob/master/reactor-extra/src/main/java/reactor/retry/Retry.java

Verwandte Themen