Spring boot 2 WebClient在订阅者中获取上下文参数

Posted

技术标签:

【中文标题】Spring boot 2 WebClient在订阅者中获取上下文参数【英文标题】:Spring boot 2 WebClient get context parameter in subscriber 【发布时间】:2018-11-01 23:03:27 【问题描述】:

我正在使用 WebClient 调用外部 API,我为每个请求关联了一个 requestId。处理请求并收到响应后,我将使用 requestId 更新一些表,以便确认与 requestId 关联的所有数据都已处理。

public void getEmployeeData(List<Integer>employeeIds, String requestId)
   WebClient webClient = WebClient.builder().baseUrl(baseUrl).build();

   webClient.post().uri(uri)
            .contentType(MediaType.APPLICATION_JSON_UTF8)
            .accept(MediaType.APPLICATION_JSON_UTF8)
            .header(HttpHeaders.AUTHORIZATION, "Basic " + Base64Utils
            .encodeToString((plainCreds)
            .getBytes(Charset.defaultCharset())))
            .body(BodyInserters.fromObject(body)).retrieve()
            .bodyToFlux(EmployeeInfo.class)
            .doOnError(throwable -> 
               Mono.error(throwable);
            ).subscribe(new Consumer<EmployeeInfo>() 
                @Override
                public void accept(EmployeeInfo employeeInfo) 
                    // Here I need the requestId which is passed as function 
                    //parameter
              
            ); 

上述函数接收带有 requestid 的员工 ID 列表,我必须调用外部 API 来获取员工列表的信息,在调用此函数之前,我会根据 requestid 保存所有员工列表,这样一旦收到响应我可以更新表格,说明已收到给定 requestId 的所有员工信息。现在在订阅者部分我需要 requestId 以便我可以关联收到的响应属于特定的 requestid

【问题讨论】:

您所指的 requestId 在哪里?你试过什么?为什么这不起作用?你需要对远程服务返回的数据做些什么吗? @BrianClozel 我用更清晰的例子更新了这个问题 我还是不明白这个问题。 requestId 方法参数在该范围内可用。为什么不能重用这里的requestId?否则,您希望在哪里找到这些信息? 【参考方案1】:

您可以在 requestId 上添加 final,以便在您的订阅功能上使用它。

public void getEmployeeData(List<Integer>employeeIds, final String requestId)

【讨论】:

以上是关于Spring boot 2 WebClient在订阅者中获取上下文参数的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot 2 WebClient在订阅者中获取上下文参数

如何将弹性 4j 重试添加到 spring boot 2 webclient 调用?

禁用 Spring Boot Webclient 日志

Spring Boot WebClient OAuth - 同时命中多个请求时超时

Spring Boot 2 OIDC(OAuth2)客户端/资源服务器未在 WebClient 中传播访问令牌

使用 Spring Boot WebClient 时如何拦截请求