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

如何正确构造此webClient调用?

奚正谊
2023-03-14

我有一个目前看起来像这样的方法:

protected void doHealthCheck(Health.Builder builder) {
    try {
        VaultHealth vaultHealth = this.webClient
            .get()
            .exchange()
                .block()
                    .bodyToMono(VaultHealth.class)
                        .block();

        if (vaultHealth.isInitialized() && !vaultHealth.isSealed() && !vaultHealth.isStandby()) {
            builder.up();
            return;
        }
    }
    catch (Exception e) {
        builder.down();
        return;
    }

    builder.down();
}

我的理解是这是错误的。所以现在我正在考虑修复它,它应该是这样的:

        this.webClient
            .get()
            .exchange()
                .doOnSuccess(???)
                .doOnError(Health.Builder::down);

. doOn成功将返回一个客户响应,我需要在调用Health之前实际检查响应中的内容。构建器::。

如果我调用. fletMap()而不是doOn成功,它会出现错误吗?或者我需要把它放在doOn成功中吗?如果我把它放在doOn成功中,似乎我需要做一个双重doOn成功(这不可能是正确的,是吗?):

.doOnSuccess(x -> x.bodyToMono(VaultHealth.class).doOnSuccess(y -> if (y...) builder.up())

此外,我假设如果我这样重组它,我不需要try/catch,因为doOnError会处理它?

虽然这个特殊的方法在操作完成后执行操作是有意义的,但是在我需要返回对象的情况下呢?我的另一个理解是,我永远不应该使用。布洛克,对吗?

共有1个答案

裴韬
2023-03-14

Mono::flatMap用于异步操作。对WebClient的调用是一种“异步”操作,因此您通常需要在WebClient::exchange方法之后使用Mono: flMap。不,您永远不应该在“WebFlux”应用程序中使用Mono::block。与其使用您拥有的,不如使用反应式方式:

    public void run(ApplicationArguments args) throws Exception {
        Health.Builder healthBuilder = new Health.Builder();
        healthBuilder.down();
        doHealthCheck(healthBuilder).onErrorReturn(healthBuilder).map(Health.Builder::build).subscribe(System.out::println);
    }
    protected Mono<Health.Builder> doHealthCheck( Health.Builder builder) {
        return webClient
            .get()
            .retrieve()
            .bodyToMono(VaultHealth.class)
            .map(vaultHealth->{
                if (vaultHealth.isInitialized() && !vaultHealth.isSealed() && !vaultHealth.isStandby())
                    builder.up();
                else 
                    builder.down();
                return builder;
            });
    }
 类似资料:
  • 说我有以下课程 和 当我调用超级构造函数时,如何保证子构造函数调用“正确”的构造函数?更具体地说,我希望100%确保我传入的三个字符串值确实设置为父级中的正确字段,而不是设置为item1 in的字段。 我知道我可以,例如: 显式创建我自己的所有参数构造函数 在子构造函数中,调用父构造函数的所有setter 但是我只是好奇Lombok是否足够聪明,以某种方式,将子类中的字段设置为父类中正确的字段?

  • 我使用cakephp2.3,并试图分页查询检索我的所有'工作'在一定的英里半径内。幸运的是,我找到了我认为我需要的查询,但是我在获取正确的数据时遇到了问题。 编辑,使每个“作业”记录都有一个lat和lng字段,另一个用户通过在搜索表单中输入自己的lat和lng值以及英里半径来执行搜索。在下面的代码中,php变量$lat$lng和$miles在我的分页器中是用户输入的搜索参数。 我在这里找到的查询h

  • 我正在尝试使用JSoup获取此URL http://betatruebaonline.com/img/parte/330/ciguen%c3%91al.jpg 相反,正确的 http://betatruebaonline.com/img/parte/330/ciguen%cc%83al.jpg 我该怎么解决这个?多谢了。

  • 很抱歉,如果这是我忽略的非常简单的事情,但我正在尝试制作一个组件,它基本上只将某些react路由器路由限制为具有活动令牌的用户。 看起来(正如预期的那样)只有“console.log(result)”执行了挂起的promise,但在最终结果中,我试图将一些逻辑编码到从后端给出的响应中(true或false),然后这些逻辑应该发送到privaterout组件,以确定是否应该将用户发送回登录,等等。。

  • 所以这就是我试过的。有更好的方法吗?

  • 问题内容: 我需要能够构建go应用程序的不同版本;“调试”版本和普通版本。 这很容易做到;我只是有一个const DEBUG,它控制应用程序的行为,但是每次我需要在构建类型之间进行交换时,都必须编辑配置文件,这很烦人。 我正在阅读有关go build(http://golang.org/pkg/go/build/)和标签的信息,我想也许我可以这样做: config.go: config.debug