Asynchronous Servlets
Asynchronous servlets and NIO are related but they're not the same.
NIO is about the acceptor and selector handling multiple IO requests and the business logic is executed by the worker thread.
Async servlet is about freeing the worker thread. Here the worker thread offloads the request from itself to threads outside the servlet container.
The entire processing consists of 3 threads.
- Selector and Worker Thread - Accepts the request from client and hands over the asynchronous thread.
- Asynchronous Processing Thread - Which does the actual processing of the request.
- Selector/Poller Thread - Write the response back to client.
It's important to understand that the request servlet thread sends a callback method to asynchronous thread. The callback method which is on a different master thread is then called by asynchronous thread when the processing finishes and then the master thread places a task for the servlet thread pool to pickup the send response to the topic.
Example of asynchronous servlet is the Spring's DeferredResult implementation.
There is no difference of the HTTP clients. The socket in which the request came in will remain connected. It will remain connected until the timeout period.
Container Threads Creation
The main threads created listener and worker threads at the boot.
Spring Reactive
In case of normal async servlets, we just offload the task to a thread pool outside of the servlet container.
But in spring reactive, the async process works similar to the event loop in NodeJS. Which means, just one thread handles everything.
Futures and Completable Futures
This is used for IO, async, parallel tasks which aren't in the context of the web server. They can be used for any workflow applications, background tasks, etc.