gpt4 book ai didi

java - 项目 react 堆 : How to retry mono with different argument until some condition is met

转载 作者:行者123 更新时间:2023-11-29 04:11:06 24 4
gpt4 key购买 nike

我需要使用项目 react 器异步生成唯一代码。

方法签名如下所示:

public Mono<String> generateCode() 

所以流程应该是这样的:

  1. 生成随机码
  2. 检查数据库中是否存在这段代码
  3. 如果存在,重新生成代码(第1步)并再次检查(第2步)
  4. 如果代码是唯一的,返回它

我目前的解决方案是像这样递归调用 generateCode:

 Mono<String> generateCode() {
String code = generateCodeValue();
return emailConfirmationRepository
.findByCode(code)
.flatMap(codeOpt -> codeOpt.map(c -> generateCode()).orElseGet(() -> Mono.just(code)));
}

但我不喜欢这样,因为每次调用都会创建自己的堆栈,这会导致 StackOverflowError。

我知道,应该有非常大量的调用,这很可能不会发生,但我仍然需要一个没有递归的解决方案,就像一个普通的 while 循环,但带有异步代码。

如何使用 reactor 实现这一点?

最佳答案

但请注意,重试将重试您的所有步骤。因此,如果您有更复杂的代码,例如:

Mono<String> generateCode() {
return Mono.fromCallable(() -> generateCodeValue())
.flatMap(code -> doSomeExpensiveOperation1())
.flatMap(code -> doSomeDangerousOperation2())
.flatMap(code -> emailConfirmationRepository
.findByCode(code)
.flatMap(codeOpt -> codeOpt
.map(c -> Mono.<String>error(new CodeAlreadyExistsException()))
.orElseGet(() -> Mono.just(code))))
.retry(5);
}
class CodeAlreadyExistsException extends RuntimeException {}

然后将再次重复“findByCode”之前的所有步骤,包括 doSomeExpensiveOperation1 和 doSomeDangerousOperation2。

关于java - 项目 react 堆 : How to retry mono with different argument until some condition is met,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55069238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com