Мне нужно отправить некоторые данные после регистрации пользователя. Я хочу сделать первую попытку в основном потоке, но если есть какие-либо ошибки, я хочу повторить попытку 5 раз с интервалом в 10 минут.
@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
для задержки между казнями? - Поток заблокирован при ожидании задержки?
- И как лучше всего повторить попытку ошибки и сделать задержку между ними?