Мне нужно генерировать уникальный код асинхронно с реактором проекта.
Подпись метода выглядит следующим образом:
public Mono<String> generateCode()
Таким образом, поток должен быть таким:
- Генерация случайного кода
- Проверьте, существует ли этот код в базе данных
- Если существует, повторно сгенерируйте код (шаг 1) и проверьте его еще раз (шаг 2)
- Если код уникален, верните его
Мое текущее решение состоит в том, чтобы вызывать generateCode рекурсивно следующим образом:
Mono<String> generateCode() {
String code = generateCodeValue();
return emailConfirmationRepository
.findByCode(code)
.flatMap(codeOpt -> codeOpt.map(c -> generateCode()).orElseGet(() -> Mono.just(code)));
}
Но мне это не нравится, потому что каждый вызов создает свойсобственный стек, и это может привести к StackOverflowError.
Я знаю, должно быть очень большое количество вызовов, это, скорее всего, не произойдет, но все же, мне нужно решение без рекурсии, как простой цикл while, но с асинхронным кодом.
Как я могу добиться этого с реактором?