【问题标题】:Spring reactive streaming data from regular WebClient request来自常规 WebClient 请求的 Spring 反应式流数据
【发布时间】:2018-04-14 06:46:56
【问题描述】:

我正在学习新的 Spring WebFlux 和响应式编程。

我想创建响应式 API,将一些数据流式传输到 Angular 客户端。 我将从不支持流的另一个(第三方)API 中获取部分数据。

所以,据我所知,我需要:

  1. 创建 REST 流端点。
  2. 链接一些服务。
  3. 此服务将使用 WebClient 每 5 秒调用一次第三方 API。和 将数据放入我的流中。 (不确定这一步)
  4. @RestController 将返回该流。

如何实现这 4 个步骤?

【问题讨论】:

    标签: spring spring-boot spring-webflux


    【解决方案1】:

    假设您的远程服务以杰克逊可以反序列化为Something.class 的 POJO 集合进行响应,您可以执行以下操作:

    @GetMapping(path = "/streaming", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    @ResponseBody
    public Flux<Something> streamSomething() {
      return WebClient.create()
        .get().uri("http://example.org/resource")
        .retrieve().bodyToFlux(Something.class)
        .delaySubscription(Duration.ofSeconds(5))
        .repeat();
    }
    

    【讨论】:

    • 不错!与Flux.interval(Duration.ofSeconds(1)).flatMap(__ -&gt; WebClient.create("http://localhost:8083/").get().exchange().flatMap(r -&gt; r.bodyToMono(Hello.class))); 在性能/效率方面是否会有所不同
    • @Maciej 我不知道。但是repeat 运营商可以提供更多。在您的情况下,您正在为每个请求重新创建一个 HTTP 客户端。
    • 是的,通常我会在某处提取 WebClient 创建。谢谢@Brian,我会更深入地了解重复运算符。
    猜你喜欢
    • 1970-01-01
    • 2020-03-29
    • 2020-04-29
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2019-05-14
    • 2015-05-21
    • 2020-06-27
    相关资源
    最近更新 更多