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

如何防止单声道被取消?

松增
2023-03-14

我试图实现一些东西作为“竞赛条件”。这个竞赛条件必须遵循这些情况:

  • 同时触发两个HTTP调用。
  • 返回第一个成功完成的调用的响应。
  • 处理最后一个呼叫。(这里最重要的是我不能丢弃最后一个呼叫,我确实需要处理它的结果:无论它的状态、成功或失败)。

此代码示例是我实现的解决方案中最接近的一个:

    Mono<StatusMock> monoA = webClient.get()
      .uri("https://some.url.a")
      .retrieve()
      .bodyToMono(StatusMock.class)
      .subscribeOn(Schedulers.boundedElastic());

    Mono<StatusMock> monoB = webClient.get()
      .uri("https://some.url.b")
      .retrieve()
      .bodyToMono(StatusMock.class)
      .doOnSuccess(this::verifyBody)
      .onErrorStop()
      .subscribeOn(Schedulers.boundedElastic());

    StatusMock statusMock = Flux.first(monoA, monoB)
      .blockFirst();

    if (statusMock != null) {
      return statusMock.getStatus();
    }

    return "empty";
  }

  private void verifyBody(StatusMock statusMock) {
    if (statusMock.getStatus().contains("error")) {
      log.error("throwing an exception");
      throw new RuntimeException("error");
    }
  }
public class StatusMock {

  private String status; // getters and setters implicit
}

在这个例子中,我使用了Flux.first方法,它帮助我返回了第一个调用,但是它丢弃(取消)了第二个调用,这是一个问题,因为我也需要最后一个调用的结果。

这种逻辑有什么解决方案吗?这里我使用的是Spring项目Reactor,但我接受任何可以帮助我解决这种情况的库或框架。

共有1个答案

步浩壤
2023-03-14

您可以使用Mono上的cache操作符来防止它们被取消:

    Mono<StatusMock> monoA = webClient.get()
      // ...
      .cache();

    Mono<StatusMock> monoB = webClient.get()
      // ...
      .cache();

    Mono.firstWithSignal(monoA, monoB);
 类似资料:
  • 我有一个表单,其中某个地方有一个提交按钮。 然而,我想以某种方式‘捕获’提交事件并防止它发生。 有什么办法我能做到这一点吗? 我不能修改submit按钮,因为它是自定义控件的一部分。

  • 本文向大家介绍如何防止cookie被盗用?相关面试题,主要包含被问及如何防止cookie被盗用?时的应答技巧和注意事项,需要的朋友参考一下 禁止第三方网站带cookie(same-site属性) 每次请求需要输入图形验证码 使用Token验证 为cookie设置HttpOnly 设置CSP 使用Referer验证 禁止网页内嵌 使用https cookie带上用户ip加密

  • 我应该写一个递归(!)方法来计算整数数组中给定整数的出现次数,如果偶数,则返回true,如果为奇数,则返回false。这是我到目前为止的代码: 它适用于 但它给出了 for 我不确定如何防止这种无休止的递归循环,因为我是编程新手,这是我第一次使用递归。提前致谢。

  • 问题内容: 我有一个表单,其中某处有一个提交按钮。 但是,我想以某种方式“捕获”提交事件并防止它发生。 有什么办法可以做到这一点? 我无法修改“提交”按钮,因为它是自定义控件的一部分。 问题答案: 与其他答案不同,返回仅是答案的 一部分 。考虑在return语句之前发生JS错误的情况… html 脚本 返回此处将不会执行,并且表单将以任何一种方式提交。您还应该致电以阻止Ajax表单提交的默认表单操

  • 嗨我刚开始学习反应式编程 我这里有这段代码,我的过程应该是我将调用TokenRepository来获取令牌,然后使用token.getAccessToken()作为cardRepository.findAllCards()上的参数 想知道这是否可行吗?

  • 我正在尝试创建以下链: 因此,我需要得到5。但是在执行1,2和3之前,4。 代码运行正常,但我想退出 从