用户注册后我需要发送一些数据。我想在主线程中进行第一次尝试,但如果有任何错误,我想以 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/