【问题标题】:who calls subscribe on Flux or Mono in reactive webapplication谁在响应式 Web 应用程序中调用 Flux 或 Mono 订阅
【发布时间】:2019-10-22 13:18:16
【问题描述】:

我正在查看一些响应式 Web 应用程序的示例,我看到它们是这样的

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@ResponseBody    
public Mono<Person> findById(...) {
    return exampleService.findById(...);
}

@RequestMapping(method = RequestMethod.GET, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
@ResponseBody
public Flux<Person> findAll() {
    Flux<Person> persons = exampleService.findAll();
    return persons;
}

当我在文档中阅读有关 Mono 和 Flux 的信息时,它提到 subscribe 必须调用 Mono 或 Flux 才能发出数据。

因此,当我在本地运行这些反应式 Web 应用程序并使用 postman/chrome 浏览器时,当我点击端点时,我会得到结果。

在服务端,虽然端点返回 Mono 或 Flux,但我如何在浏览器/邮递员中看到实际结果。 每当我点击返回 Mono/Flux 类型的端点时,浏览器是否会在内部调用 subscribe

【问题讨论】:

标签: reactive-programming spring-webflux project-reactor


【解决方案1】:

这取决于您使用的服务器。

例如,Tomcat、Jetty(Servlet 3.1 非阻塞 I/O) - ServletHttpHandlerAdapter 来自 org.springframework.http.server.reactive 包。

订阅发生在 service 方法中:

@Override
public void service(ServletRequest request, ServletResponse response) throws 
  ServletException, IOException {        
    ...
    HandlerResultSubscriber subscriber = new HandlerResultSubscriber(asyncContext, 
        isCompleted, httpRequest);
    this.httpHandler.handle(httpRequest, httpResponse).subscribe(subscriber);
}

【讨论】:

    【解决方案2】:

    MonoFlux 概念仅存在于您的应用程序中,而 HTTP 协议用于在您的 postman/chrome 应用程序和您的应用程序之间进行通信。
    Spring Webflux 框架的内部类订阅控制器方法返回的MonoFlux 实例,并根据您在RequestMapping 中指定的MediaType 将它们映射到HTTP 数据包。

    【讨论】:

    • 因此,如果媒体类型不是事件流,可能像 json,那么 webflux 框架是否会在控制器返回的 Mono 上调用 subscribe 并阻塞直到触发 oncomplete 或 onerror 然后将响应返回给客户端(浏览器/邮递员)。
    • 是的,没错。如果返回类型是 Flux 并且媒体类型只是 json,那么 Spring 将订阅 Flux,等到最后一个元素或错误,并将在一个 HTTP 响应中序列化整个元素列表。 Infinite Flux 会导致客户端超时。
    • 谢谢你,你能给我指出一个记录了这一点的资源吗?
    • @vjk 我不知道它在文档中的描述。这些只是我在调试 webflux 应用时的观察。
    猜你喜欢
    • 2018-06-07
    • 2021-10-10
    • 2020-03-17
    • 2022-10-01
    • 1970-01-01
    • 2018-01-20
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多