我有两个必须处理的ID的不同来源。一个来自文件,另一个来自URL。当我从“文件”行创建Flux
时,我可以很好地进行处理。当我用使用WebClient .... get()的函数切换Flux创建函数时,会得到不同的结果。 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)
.
.
.
答案 0 :(得分:1)
从您的问题更新来看,似乎没有什么等待处理完成。我假设这是批处理或CLI应用程序,而不是Web应用程序?
假设以下内容:
Flux<User> users = userService.fetchAll();
在blockLast
上调用Flux
将触发处理,并block
直到结果在那里。
在其上调用subscribe
将异步触发处理;我们在您的日志中看到订户request
元素,但仅此而已。这可能意味着JVM在发布任何元素之前退出-没有任何等待结果。
如果您正在有效地编写某些CLI /批处理应用程序而不在Web应用程序中处理请求,则可以在最终的反应式管道上block
来获得结果。如果希望将该结果写入文件或将其发送到其他服务,则应使用反应堆运算符在其上进行组合。