Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Threads in Spring

I have a Web application using spring and hibernate and struts (it runs on Tomcat)

The call sequence is something like this...

Struts action calls spring service bean which in turn calls Spring DAO bean. The DAO implementation is a Hibernate implementation.

The question is Would all my spring beans be running in the same thread ? Can I store something in the ThreadLocal and get it in another bean?

I am quite sure this would not work in Stateless Session Bean. The EJB container can (or will) spawn a new thread for every call to the session bean

Will the spring container do the same? i.e. run all beans in the same thread ?

When I tried a JUnit test - I got the same id via Thread.currentThread().getId() in the Test Case and the two beans- which leads me to believe there was only one thread in action

Or is the behavior unpredictable? Or will it change when running on Tomcat server ?

Clarification I do not wish to exchange data between two threads. I want to put data in the ThreadLocal and be able to retrieve it from all beans in the call stack. This will work only if all beans are in the same thread

like image 421
RN. Avatar asked Apr 23 '09 16:04

RN.


Video Answer


2 Answers

Spring doesn't spawn the threads. Tomcat does. Spring is just creating and wiring up the objects for you.

Each request from the browser is processed in one request. It is Tomcat that handles the request. It is Tomcat that creates the thread to process the request.

Assuming you have just created a singleton bean in Spring called "X". Then the same instance of X is used by all requests.

The Spring beans don't live in a thread. They are just allocated on the heap.

like image 120
A_M Avatar answered Sep 23 '22 12:09

A_M


Would all my spring beans be running in the same thread ? Can I store something in the ThreadLocal and get it in another bean? AFAIK for the components you mentioned (service bean, DAO bean - i guess they are plain spring beans), Spring does not spawn a new thread. I do not understand your use case (ie, exchanging data between two threads).

For most webapps, a new thread is spawned for each new request, and if you want to share data between two requests you normally: - use the get/post parameters to pass the data - use the session to share data

To answer your question, I'm pretty sure the spring container does not spawn threads for most components.

like image 28
Miguel Ping Avatar answered Sep 22 '22 12:09

Miguel Ping