[jboss-user] [jBPM] - Session and thread safety

Marcin Gałązka do-not-reply at jboss.com
Tue Mar 13 07:15:08 EDT 2012


Marcin Gałązka [https://community.jboss.org/people/marcin.galazka] created the discussion

"Session and thread safety"

To view the discussion, visit: https://community.jboss.org/message/723455#723455

--------------------------------------------------------------
Hi

jBPM 5.2, PostgreSQL 9.1.

Kris wrote ( https://community.jboss.org/message/613360#613360#613360 https://community.jboss.org/message/613360#613360) that session is thread safe. Well, getWorkItemManager() present in various implementations (e.g. CommandBasedStatefulKnowledgeSession) does not look particulary safe.

Anyway, my biggest issue is with SingleSessionCommandService. It uses *single* EntityManager instance to perform a database-related operations - see JpaPersistenceContextManaager#getApplicationScopedPersistenceContext, it returns the same (wrapped) appScopedEntityManager. Now, there are two scenarios wrt how SingleSessionCommandService#execute() can be called:
- there is no active JTA transaction,
- there is an active JTA transaction (e.g. the method is called from a business layer where someone already started a JTA transaction).

First one is not interesting - execute() will create a new transaction, do its work and commit the transaction. So far so good.

Second one means that in case of many threads calling SingleSessionCommandService#execute() at the same time the same connection will be used to perform many transactions *at the same time*. Now you can pick your favourite exception:
- org.postgresql.xa.PGXAException: Transaction interleaving not implemented (see  http://jdbc.postgresql.org/documentation/faq.html#transaction-interleaving http://jdbc.postgresql.org/documentation/faq.html#transaction-interleaving)
- org.hibernate.AssertionFailure - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
- org.postgresql.xa.PGXAException: Connection is busy with another transaction

You can say that SingleSessionCommandService#execute() is synchronized but it does not help here. The commit (and the flush from EntityManager) happens elsewhere. Overall I think that SingleSessionCommandService is playing a very dangerous game in JTA managed environment. What is the rationale for *SingleSession*CommandService and PersistenceContextManager#getApplicationScopedPersistenceContext() anyway?

A simple test case attached, run few times or increase totalWorkers if you do not get exception at the first pass. If you want more standalone (e.g. Maven based) example let me know. A Spring-based simple web application can be provided as well.
--------------------------------------------------------------

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

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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jboss-user/attachments/20120313/c1d51f3d/attachment.html 


More information about the jboss-user mailing list