Reputation: 2283
I am looking at some examples of reactive web applications and i am seeing them like this
@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;
}
When i am reading about the Mono and Flux in the documentation it mentioned subscribe has to be called for Mono or Flux to emit the data.
So when i run these reactive webapplications locally and using postman/chrome browser when i hit the endpoints i getting the results.
On the service side though endpoints are returning Mono or Flux, how i am seeing the actual results in the browser/postman. Is the browser doing the part of calling the subscribe internally whenever i am hitting the endpoints that return Mono/Flux types?
Upvotes: 17
Views: 6964
Reputation: 771
It depends on which server you use.
For instance, Tomcat, Jetty (Servlet 3.1 non-blocking I/O) - ServletHttpHandlerAdapter
from org.springframework.http.server.reactive
package.
Subscription happens in service method:
@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);
}
Upvotes: 5
Reputation: 4410
Mono
and Flux
concepts exist only within your application, while HTTP protocol is used to communicate between your postman/chrome app and your application.
Internal classes of the Spring Webflux framework subscribe to Mono
and Flux
instances returned by your controller methods and map them to HTTP packets based on the MediaType
that you specified in RequestMapping
.
Upvotes: 12