I have a question about thread management for the tomcat server and application. Here is a sample code:
@RequestMapping(path = "/asyncCompletable", method = RequestMethod.GET)
public CompletableFuture<String> getValueAsyncUsingCompletableFuture() {
logger.info("Request received");
CompletableFuture<String> completableFuture
= CompletableFuture.supplyAsync(this::processRequest);
logger.info("Servlet thread released");
return completableFuture;
}
private String processRequest() {
Long delayTime = 10000L;
logger.info("Start processing request");
try {
Thread.sleep(delayTime);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
logger.info("Completed processing request");
return "Processing done after " + delayTime;
}
Here, This is a simple API using spring boot. What I have done here?
- It is simple endpoints that is a simple GET method and returning a string as a response.
- In method
getValueAsyncUsingCompletableFuture
I am callingprocessRequest
onCompletableFuture.supplyAsync(this::processRequest)
. So obviously it will run under separate thread. - In method
processRequest
where only have aThread.sleep
for 10s. - Both methods have an entry and exit log.
- Also the API
getValueAsyncUsingCompletableFuture
is returning acompletableFuture
Now after calling the Endpoints from the browser its output is as expected. It waits 10 seconds and provides a response. The output log is given below.
Here,
- The first and second line of log is showing under
nio-8080-exec-8
thread. It also showing request received and servlet thread released. - In the last 2 lines of log for method
processRequest
. Here it is showing forCompletableFuture
execution part. It is handling underonPool-worker-2
thread.
Now, Here is my question:
- During the execution of
processRequest
method, is it released the tomcat allocated threadnio-8080-exec-8
? I am telling based on the log. Is this thread released and go back to tomcat connection pool? - If the tomcat thread released then how the client is getting a response after the execution of
completableFuture
is done? - Can you please describe how thread allocation occur when request come to tomcat server, and spring application.
Thanks in advance