Robert Geisler [http://community.jboss.org/people/robert.geisler] created the 
discussion

"release ThreadlocalPool resources?"

To view the discussion, visit: http://community.jboss.org/message/589030#589030

--------------------------------------------------------------
hello community...

i have got some questions concerning invoking and pooling of Stateless Session 
Beans (SLSB).

we use JBoss 4.2.2 default configuration, EJB3 SLSBs are pooled by 
ThreadlocalPool (deploy/ejb3-interceptors-aop.xml). we noticed from JMX Console 
that the SLSB pools blow up in the long run, meaning that a lot of SLSB objects 
are kept in heap space. we investigated this behaviour and it seems that thread 
creation may be the root case of the problem.

our client uses Remote Method Invocation (RMI) through the DefaultEjb3Connector 
(JBoss Remoting Connector, deploy\ejb3.deployer\META-INF\jboss-service.xml). 
the Remoting Connector installs an AcceptorThread. whenever a client does 
invoke a Remote Business Interface method a SocketServerInvoker routes the 
client invocation from this AcceptorThread to a WorkerThread (ServerThread) 
that actually handles the request.

in case multiple clients invoke methods concurrent, multiple WorkerThreads are 
created from AcceptorThread, thus we got t running WorkerThreads on the server 
(where t corresponds to the maximum of concurrent client invocations at a 
single moment). it seems that these WorkerThreads stay alive after invocation 
response and get used by next client invocations.

now a client invocation triggers some business logic to be performed on the 
server. this process involves b SLSBs (starts from client with remote 
invocation and uses several local invocations between EJBs!). for each SLSB 
there is a pool (ThreadlocalPool as mentioned before). the ThreadlocalPool 
creates new instances of our EJBs for every WorkerThread on the server (see 
StatelessInstanceInterceptor.invoke) and always keeps one of these instances 
(see ThreadlocalPool.release). as the result there are (t * b) bean instances 
that will never be destroyed until server shutdown (note: it is possible to 
stop SLSB pool, destroying all the bean instances (InfinitePool.destroy), but 
we dont want to manually start/ stop these pools during runtime!).

we think this is a strange behaviour! just imagine 100 clients invoke some 
business functionality at the same time. that creates 100 WorkerThreads. 
assumming that the business logic involves 5 different EJBs there will be 100 * 
5 = 500 objects (bean instances) in the heap space. and these objects will 
never be released/ destroyed!?

maybe i just did not find it... so let me simply ask for it:

* is there a mechanism that removes (killes or finishes) WorkerThreads after 
responding to the client?
or are these threads supposed to stay alive forever?


in addition we deploy a MessageDrivenBean (MDB) on the server and register it 
to a Queue. the MDB is a single instance MDB (configured through 
ActivationConfigProperty maxSession=1). the clients may send messages to this 
Queue to inform the server about some status and the MDB will process these 
messages one by one.

when a message is received the onMessage method of our MDB is invoked in so 
called WorkManager thread (PooledInvoker invokes JmsServerSession.run which 
invokes onMessage on the MDB). the onMessage again involves several EJBs (local 
invocations!) and therefor instances of these EJBs are create from 
ThreadlocalPool. after a message is processed the WorkManager thread finishes, 
thus dies. but after the thread died the bean instances created by the 
ThreadlocalPool are kept in InfinitePool.active. that means if JBoss is running 
some days without restart and the MDB receives more and more messages 
(processed by newly created threads), the pool blows up, because 
ThreadlocalPool does not destroy the bean instances ever. is this the way it is 
supposed to be?? or

* is there a mechanism that removes bean instances from ThreadlocalPool 
(respectively from InfinitePool.active) after the corresponding thread died??


i read some documentation in WIKI and the forums. there was mentioned another 
Pool implementation: StrictMaxPool. StrictMaxPool does not create bean 
instances per thread, but creates instances on demand, restricted by a maximum 
pool size. for MDBs the StrictMaxPool is configured as default in 
ejb3-interceptors-aop.xml, but for SessionBeans it is ThreadlocalPool.

* why are there different default pool configurations for Session and 
MessageDrivenBeans?
* what are the advantages and disadvantages of ThreadlocalPool and 
StrictMaxPool (performance??)?
are there general guide lines that explain when to use ThreadlocalPool or 
StrictMaxPool?
* could StrictMaxPool solve the problems that ThreadlocalPool causes in the 
situations described above?
StrictMaxPool should not keep bean instances, but release them after response 
-independent of which thread created and used the bean, shouldnt it?


i am confused by the different mechanism to Remote Method Invocations and 
incovations through Java Messaging are handled... i would be glad if someone 
could explain these differences to, especially in case of the SLSB pools, 
threading and client invocations.

thanks in advance
robert
--------------------------------------------------------------

Reply to this message by going to Community
[http://community.jboss.org/message/589030#589030]

Start a new discussion in EJB3 at Community
[http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2029]

_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to