当前位置: 首页 > 知识库问答 >
问题:

Webflux在何时重复或何时重试

严狐若
2023-03-14

我使用SpringBoot和Webflux的反应式编程。我想重复对endpoint的一些调用,直到数据可用为止(将返回一些内容)。

我想调用commandControllerApi。findById直到displayCommand返回状态为==SUCCESS。如何告诉Webflux我的链的这一部分应该被调用5次,例如,因为我的数据库中的数据应该在5-10秒后出现。。。

我认为当前代码会导致再次调用整个链,而不仅仅是调用我链的适当部分(.flatMap(commandResponse))-

我的代码:

public Mono<Boolean> validateCredentials(FlowConfCredentials flowCredentials, UUID agentId) {
    return securityService
        .getUser()
        .flatMap(
            user -> {
              Command command = new Command ();
              command.setAgentId(agentId.toString());
              command.setCommandType(COMMAND_TYPE);
              command.setArguments(createArguments());
              command.setCreatedBy(
                  user.getEmail());
              return commandControllerApi.saveCommand(command);
            })
        //       .retryWhen(Retry.fixedDelay(5, Duration.ofSeconds(5)))
      .flatMap(commandResponse -> commandControllerApi.findById(commandResponse.getCommandId()))
        .filter(displayCommand -> displayCommand.getStatus().equals(OaCommandStatus.SUCCESS))
        .retryWhen(Retry.fixedDelay(5, Duration.ofSeconds(5)))
//        .repeatWhenEmpty(
//            Repeat.onlyIf(repeatContext -> true)
//                .exponentialBackoff(Duration.ofSeconds(5), Duration.ofSeconds(5))
//                .timeout(Duration.ofSeconds(30)))
        .filter(
            commandResponse ->
                commandResponse.getStatus() != null
                    && commandResponse.getStatus().equals(CommandStatus.SUCCESS))
        .map(commandResponse -> true)
        .switchIfEmpty(Mono.just(false));
  }

下面是调用上面的metohd的方法:

 public Flux<CredConfiguration> saveCredentials(
      Mono<FlowConfCredentials> flowCredentials, UUID agentId) {
    return flowCredentials
        .filterWhen(cred -> validationService.validateCredentials(cred, agentId))
        .flatMapMany(
            flowConfCredentials -> {
              if (condition1()) {
                return caveCredentials(flowConfCredentials);
              }
              if (condition2()) {
                return saveCredentialsForUser(flowConfCredentials.getExistingCredentials());
              }
              return Flux.error(new EmptyConfigurationException(CREDENTIALS_MESSAGE));
            });
  }

共有1个答案

卓宏达
2023-03-14

要仅重复订阅findById返回的mono而不重新订阅上游saveCommand/getUser,请将筛选器/repeatWhenEmpty移动到调用findById的flatMap中。

public Mono<Boolean> validateCredentials(FlowConfCredentials flowCredentials, UUID agentId) {
    return securityService
        .getUser()
        .flatMap(
            user -> {
              Command command = new Command();
              command.setAgentId(agentId.toString());
              command.setCommandType(COMMAND_TYPE);
              command.setArguments(createArguments());
              command.setCreatedBy(
                  user.getEmail());
              return commandControllerApi.saveCommand(command);
            })
        .flatMap(saveResponse -> commandControllerApi.findById(saveResponse.getCommandId())
           .filter(findResponse -> findResponse.getStatus().equals(OaCommandStatus.SUCCESS))
           .repeatWhenEmpty(
                Repeat.onlyIf(repeatContext -> true)
                    .exponentialBackoff(Duration.ofSeconds(5), Duration.ofSeconds(5))
                    .timeout(Duration.ofSeconds(30))))
        .hasElement();
}
 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 我应该在MySQL中使用datetime或timestamp数据类型吗? (39个答案) 6年前关闭。 我已经搜索了此文件,但没有明确的答案(尤其是后者)。在什么情况下应该使用日期时间或时间戳记? 问题答案: 假设您使用的是MS SQL Server(不是,请参见 下面 的 更新 ): 一个表只能有一个时间戳列。每次插入或更新包含时间戳列的行时,都会更新

  • 问题内容: 我想做的是在有webclient的Webflux中的Mono上有条件地重复。情况如下: 我们有一些商务休息服务服务,可返回生成的文档。此文档的生成是由在此之前调用的另一服务触发的。但是,回到正题:文档生成服务需要10到30秒。我们想要做的是:10秒钟后检查是否生成文档(单声道)。如果是这样,一切都很好。如果不是,请在5秒钟后重复(或重试)并检查是否生成了文档。依此类推,直到(最坏的情况

  • 我要做的是用WebClient对Webflux中的单声道进行有条件的重复。情况如下: 我们有一些返回生成文档的业务rest服务。此文档的生成是从在此文档之前调用的另一个服务触发的。但是,回到业务:文档生成服务需要10-30秒。我们要做的是:10秒后检查是否生成了文档(单)。如果是这样,一切都很好。如果没有,请在5秒后重复(或重试)并检查是否生成了文档。以此类推,直到(最坏的情况)30秒后超时。这可

  • 我正试图找出处理异常的最具Python风格的方法。假设我们有一个长方法,它可以完成多个注册汽车的任务 例如 检索汽车详细信息 计算税款 发送确认电子邮件 调用方法是否应该处理异常: 或者单个方法本身是否应该处理异常。如果在这个方法中有任何异常,我们只想记录下来(或者在这个例子中打印出来)并继续。 是一种方法比另一种方法更pythonic,还是归结为更具可读性?我更喜欢第二种方式,但我们似乎更频繁地

  • 问题内容: 我正在尝试保存要分析的歌曲信息,但是如果该歌曲已经存在于分析中,我希望我的代码什么也不做。 我在下面尝试过此代码: 上面的代码在日志中给出以下结果: 成功取得4分。歌曲已存在成功检索到4个乐谱。歌曲已存在成功检索到4个乐谱。歌曲已存在成功检索到4个乐谱。歌曲已存在成功成功成功成功成功成功成功成功成功成功成功成功 为什么我的for循环比Objects.count循环更多?以及如何防止解析