用户注册后我需要发送一些数据。我想在主线程中进行第一次尝试,但如果有任何错误,我想以 10 分钟的间隔重试 5 次。

@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();
}

有用。
但我有一些问题:
  • doOnNext 函数中进行操作是否正确?
  • 使用 delayElement 在执行之间延迟是否正确?
  • 等待延迟时线程是否阻塞?
  • 什么是重试错误并在其之间延迟的最佳实践?
  • 最佳答案

    用于记录的

  • doOnXXX 很好。但是对于实际的元素处理,您必须更喜欢使用 flatMap 而不是 doOnNext (假设您的处理是异步的/可以转换为返回 Flux/Mono )。
  • 这是正确的。另一种方法是转换代码并从 Flux.interval 开始,但这里 delayElement 是更好的 IMO。
  • 延迟在单独的线程/调度程序(默认情况下, Schedulers.parallel() )上运行,因此不会阻塞主线程。
  • 实际上在 Retry 插件中有一个 reactor-extra builder 专门用于这种用例:https://github.com/reactor/reactor-addons/blob/master/reactor-extra/src/main/java/reactor/retry/Retry.java
  • 关于java - Project Reactor 异步发送电子邮件并重试错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44310597/

    10-10 05:01