Spring MVC: What happens if I start a thread in a controller action? Spring MVC: What happens if I start a thread in a controller action? multithreading multithreading

Spring MVC: What happens if I start a thread in a controller action?


Yes, You can start new Thread in Controller. But better way of doing asynchronous job is to use spring-scheduling support. You can leverage Quartz framework. That will manage your job.

This link will give you how to integrate this in your application.


Yes, it'll work. On one web app I worked on, I needed to send a notification email depending on the user's action. I added a post-commit interceptor on the service, and had that fire off the email in a separate thread. (In my case that happened to be cleaner than putting the code in the controller, because I only wanted it to happen if the transaction committed.)

You do need to make sure the thread actually stops running at some point, either by setting daemon to true (if it's ok that stopping the server kills the thread without notice) or making sure the code in its run method will always terminate at some point.

You are better off using a threadpool than creating new threads, so you don't risk resource exhaustion (threads stalling out are usually not independent events, if a thread hangs the next one probably will too, so you need a way to cut your losses). Methods annotated with @Async will be executed using an executor that you can configure as shown in the Spring documentation.


As the others mentioned, it's will work. ExecutorService can do the job. Here you can see I used it for starting a video stream that sits on a separate endpoint.

@PostMapping("/capture")public ResponseEntity capture() {    // some code omitted    ExecutorService service = Executors.newCachedThreadPool();    service.submit(() -> startStreaming(deviceConfig));    return return ResponseEntity.ok()            .body(stream);}