首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring 5 WebClient只在.exchange()之后使用.block()进行Http调用

Spring 5 WebClient只在.exchange()之后使用.block()进行Http调用
EN

Stack Overflow用户
提问于 2018-08-10 03:55:14
回答 1查看 5.7K关注 0票数 2

这一调用如预期的那样工作,并使该职位成功地:

代码语言:javascript
复制
public class MyService implements IMyService {

private final WebClient webClient;
private final String url;

MyService(@Qualifier("web-client") WebClient webClient,
                      String url) {
    this.webClient = webClient;
    this.url = url;
}

@SneakyThrows
@Override
public void execute(Long jobId) {
    MultiValueMap<String, String> requestParms = new LinkedMultiValueMap<>();
    requestParms.add("arguments", "--batchJobId=" + jobId.toString());
    HttpEntity<MultiValueMap<String, String>> requestEntity =
        new HttpEntity<>(requestParms, null);

    final WebClient.ResponseSpec responseSpec = webClient.post()
        .uri(new URI(url + "/tasks/executions"))
        .body(BodyInserters.fromMultipartData(requestParms))
        .exchange()
        .block();
}
}

在配置类中:

代码语言:javascript
复制
@Bean
@Qualifier("web-client")
public WebClient getWebClient() {
    return WebClient.builder()
        .filter(basicAuthentication("user", "pass"))
        .filter(printLnFilter())
        .build();
}

private ExchangeFilterFunction printLnFilter() {
    return (request, next) -> {
        System.out.println("\n\n" + request.method().toString().toUpperCase() + ":\n\nURL:"
            + request.url().toString() + ":\n\nHeaders:" + request.headers().toString() + "\n\nAttributes:"
            + request.attributes() + "\n\n");

        return next.exchange(request);
    };
}

在上面的示例中,我们看到了已记录的URL、属性和头以及完全成功的Http调用。但是,只要删除块()调用,就不会进行任何调用,也就没有日志:

代码语言:javascript
复制
 // No call made
 final WebClient.ResponseSpec responseSpec = webClient.post()
            .uri(new URI(url + "/tasks/executions"))
            .body(BodyInserters.fromMultipartData(requestParms))
            .exchange();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-10 04:04:53

那是因为它没有阻塞..。

来自春季文档

简单地说,WebClient是一个表示执行web请求的主要入口点的接口。 它已经作为SpringWebReactive模块的一部分创建,并将在这些场景中取代经典的RestTemplate。新客户端是一种反应性的、非阻塞的解决方案,可以在HTTP/1.1协议上工作。

它是一个通过反应流实现使用工程堆概念的实现

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51778727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档