【发布时间】:2019-05-01 13:58:27
【问题描述】:
我必须使用两个不同的 ID 来源。一个来自文件,另一个来自 URL。当我从文件的行创建Flux 时,我可以很好地处理它。当我将 Flux-creating 函数与使用 WebClient....get() 的函数切换时,我得到了不同的结果;由于某种原因,WebClient 永远不会被调用。
private Flux<String> retrieveIdListFromFile(String filename) {
try {
return Flux.fromIterable(Files.readAllLines(ResourceUtils.getFile(filename).toPath()));
} catch (IOException e) {
return Flux.error(e);
}
}
这里是 WebClient 部分...
private Flux<String> retrieveIdList() {
return client.get()
.uri(uriBuilder -> uriBuilder.path("capdocuments_201811v2/selectRaw")
.queryParam("q", "-P_Id:[* TO *]")
.queryParam("fq", "DateLastModified:[2010-01-01T00:00:00Z TO 2016-12-31T00:00:00Z]")
.queryParam("fl", "id")
.queryParam("rows", "10")
.queryParam("wt", "csv")
.build())
.retrieve()
.bodyToFlux(String.class);
}
当我在 WebClient 的通量上执行 subscribe(System.out::println) 时,没有任何反应。当我执行 blockLast() 时,它可以工作(调用 URL,返回数据)。我不明白为什么,如何纠正,以及我做错了什么。
使用源自文件的通量,即使订阅也可以正常工作。我有点想,通量是可以互换的......
当我做retrieveIdList().log().subscribe():
INFO [main] reactor.Flux.OnAssembly.1 | onSubscribe([Fuseable] FluxOnAssembly.OnAssemblySubscriber)
INFO [main] reactor.Flux.OnAssembly.1 | request(unbounded)
当我用 blockLast() 而不是 subscribe() 做同样的事情时:
INFO [main] reactor.Flux.OnAssembly.1 | onSubscribe([Fuseable] FluxOnAssembly.OnAssemblySubscriber)
INFO [main] reactor.Flux.OnAssembly.1 | request(unbounded)
INFO [reactor-http-nio-4] reactor.Flux.OnAssembly.1 | onNext(id)
.
.
.
【问题讨论】:
-
你能在 webclient 上添加一个
log()运算符来看看发生了什么吗?另外,是否可以在底层 reactor netty HttpClient 上启用wiretap,以便我们可以看到 HTTP 请求/响应? -
您能用所要求的信息更新您的问题吗?您还缺少 HTTP 日志。
-
什么都没有,没有发送请求。
标签: spring-webflux project-reactor