Hi,
I'm using threads inside a stateless bean and I cannot persist anything without having
that annoying message that states I can only use transaction manager inside a
transactional context.
I've tried to make a busy-wait on my stateless bean so I can assure my bean will be
alive until the very moment my thread needs the entityManager but when the execution
reaches the entityManeger.merge( object ) an exception is risen.
The story:
I have a jboss-4.0.5.GA with an upgrade on my original Javassist. Now I have javassist-3.4
due to issues with threads.
My application needs to perform a fork in execution flow split in three parts. Both of
them are created as threads and are observed in normal-fashion-way observer pattern, where
the Stateless Bean is the observer.
I have a hunch that my bean life-cycle ends before my first thread finishes, so the
entityManager looses it transactional context.
Can anybody point a blueprint for creating a structure to support such a business demand?
Here some parts of my code so you can place yourself. This code comes with only one
thread. The original one has three, all like this one.
@TransactionManagement(TransactionManagementType.CONTAINER)
public @Stateless(name = "TempoRealRN") class TempoRealRNBean extends
IntegratorCommonBehavior implements TempoRealRN, Observer {
@EJB(beanName = "GenericoDAO")
GenericoDAO genericoDAO;
@PersistenceContext private EntityManager entityManager;
private static final Log log = LogFactory.getLog(TempoRealRNBean.class);
...
public void processar(CommonController controladorComum) throws IntegratorException {
super.setEntityManager(this.entityManager);
tCorFrente = new ThreadCorFrente(controladorComum, this, log, dto,
nomeThreadFrente, grupoFrente);
tCorFrente.addObserver(this);
tCorFrente.start();
}// ends of: public void processar(...) ....
/*
* receives notification from thread state change and executes the proper action to
acomplish bussiness rule goals.
*
*/
public void update(Object o) {
//perform some state tests
//then try to persist.
//at this point an exception is risen
this.entityManager.merge( object );
}
}//ends public void update(Object o)
}//ends class
The exception risen is:
--------------------------
17:01:47,480 ERROR [STDERR] Caused by: javax.persistence.TransactionRequiredException:
EntityManager must be access within a transaction
17:01:47,480 ERROR [STDERR] at
org.jboss.ejb3.entity.ManagedEntityManagerFactory.verifyInTx(ManagedEntityManagerFactory.java:150)
17:01:47,480 ERROR [STDERR] at
org.jboss.ejb3.entity.TransactionScopedEntityManager.merge(TransactionScopedEntityManager.java:180)
17:01:47,480 ERROR [STDERR] at
wm.integrator.negocio.temporeal.impl.TempoRealRNBean.persistirFrente(TempoRealRNBean.java:485)
It would be great if some good soul could enlight me regarding on how to use the proper
pattern for observing threads and how I can make this persistence work.
Thank you all just for being patient enough to read this extensive post.
I apologize myself for any English grammar misuse or misspell as English is not my 1st
language. I'm from Brazil.
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4064742#...
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&a...