代码之家  ›  专栏  ›  技术社区  ›  Frischling

WebClient中的通量与File.readLines中的通量行为不同

  •  0
  • Frischling  · 技术社区  · 7 年前

    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);
      }
    }
    

    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);
    }
    

    当我做一个 subscribe(System.out::println) 在WebClient的流量中,什么都没有发生。当我执行blockLast()时,它会工作(调用URL,返回数据)。我不明白为什么,如何纠正,我做错了什么。 使用源于文件的流量,即使订阅也可以正常工作。我认为,通量是可以互换的。。。

    当我做一个 retrieveIdList().log().subscribe() :

    INFO [main] reactor.Flux.OnAssembly.1 | onSubscribe([Fuseable] FluxOnAssembly.OnAssemblySubscriber)
    INFO [main] reactor.Flux.OnAssembly.1 | request(unbounded)
    

    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 回复  |  直到 7 年前
        1
  •  1
  •   Brian Clozel    7 年前

    从您的问题更新判断,似乎没有什么事情等待处理完成。我假设这是一个批处理或CLI应用程序,而不是web应用程序?

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

    使命感 blockLast 在 Flux 将触发处理和 block 直到结果出来。

    使命感 subscribe request 元素,但仅此而已。这可能意味着JVM在发布任何元素之前就退出了——没有任何东西等待结果。

    如果您正在有效地编写某些CLI/批处理应用程序,而不是在web应用程序中处理请求,则可以 在最后的反应管道上得到结果。如果您希望将结果写入文件或发送到其他服务,那么您应该使用reactor操作符对其进行编写。