Probably a repeat! I am using Tomcat as my server and want to know what is best way to spawn threads in the servlet with deterministic outcomes. I am running some long running updates from a servlet action and would like for the request to complete and the updates to happen in the background. Instead of adding a messaging middleware like RabbitMQ, I thought I could spawn a thread that could run in the background and finish in its own time. I read in other SO threads that the server terminates threads spawned by the server in order for it to manage resources well.
Is there a recommended way of spawning threads, background jobs when using Tomcat. I also use Spring MVC for the application.
In a barebones servletcontainer like Tomcat or Jetty, your safest bet is using an applicaton wide thread pool with a max amount of threads, so that the tasks will be queued whenever necessary. The
ExecutorServiceis very helpful in this.Upon application startup or servlet initialization use the
Executorsclass to create one:Then during servlet’s service (you could ignore the result for the case that you aren’t interested, or store it in the session for later access):
Where
YourTaskmust implementRunnableorCallableand can look something like this, wherebyyourDatais just your data, e.g. populated with request parameter values (just keep in mind that you should absolutely not pass Servlet API artifacts such asHttpServletRequestorHttpServletResponsealong!):Finally, during application’s shutdown or servlet’s destroy you need to explicitly shutdown it, else the threads may run forever and prevent the server from properly shutting down.
In case you’re actually using a normal JEE server such as WildFly, Payara, TomEE, etc, where EJB is normally available, then you can simply put
@Asynchronousannotation on an EJB method which you invoke from the servlet. You can optionally let it return aFuture<T>withAsyncResult<T>as concrete value.see also: