谁在响应式 Web 应用程序中调用订阅 Flux 或 Mono

who calls subscribe on Flux or Mono in reactive webapplication

我正在查看一些响应式 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 的内容时,它提到 订阅 必须调用 Mono 或 Flux 才能发出数据。

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

在服务方面,虽然端点是 returning Mono 或 Flux,但我如何在 browser/postman 中看到实际结果。 每当我访问 return Mono/Flux 类型的端点时,浏览器是否在内部调用 subscribe

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

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

例如,Tomcat,Jetty (Servlet 3.1 non-blocking I/O) - ServletHttpHandlerAdapter from org.springframework.http.server.reactive package.

订阅发生在 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);
}