WebClient的Flux的行为与File.readLines的Flux的行为不同

时间:2018-11-29 13:28:05

标签: spring-webflux project-reactor

我有两个必须处理的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)
.
.
.

1 个答案:

答案 0 :(得分:1)

从您的问题更新来看,似乎没有什么等待处理完成。我假设这是批处理或CLI应用程序,而不是Web应用程序?

假设以下内容:

Flux<User> users = userService.fetchAll();

blockLast上调用Flux将触发处理,并block直到结果在那里。

在其上调用subscribe将异步触发处理;我们在您的日志中看到订户request元素,但仅此而已。这可能意味着JVM在发布任何元素之前退出-没有任何等待结果。

如果您正在有效地编写某些CLI /批处理应用程序而不在Web应用程序中处理请求,则可以在最终的反应式管道上block来获得结果。如果希望将该结果写入文件或将其发送到其他服务,则应使用反应堆运算符在其上进行组合。