TransactionRequiredException: EntityManager must be access w
paoletto Nov 5, 2007 8:38 AMit's somehow strange,because i said in the code that for my method i REQUIRE_NEW transaction...
package bps.ejb; import javax.ejb.*; import javax.persistence.*; import java.util.*; import java.sql.*; @Stateless public class BpsProcessQueueBean implements BpsProcessQueue { public static final String RemoteJNDIName = BpsProcessQueueBean.class.getSimpleName() + "/remote"; public static final String LocalJNDIName = BpsProcessQueueBean.class.getSimpleName() + "/local"; @PersistenceContext private EntityManager em; @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) private Process fetchProcess_real(int subsystem) { String fetchQuery = "SELECT " + " p " + "FROM " + " Process AS p " + "WHERE " + " p.state = 0 AND " + " p.processQueue.id IN " + " (SELECT " + " pq.id " + " FROM " + " ProcessQueue AS pq " + " WHERE " + " (pq.subsystem.id = " + " (SELECT " + " s.id " + " FROM " + " Subsystem AS s " + " WHERE " + " (s.id = " + subsystem + ") AND " + " (s.connected = true) " + " ) " + " ) AND " + " (pq.connected = true) AND " + " (pq.curActiveProcesses < pq.maxActiveProcesses) " + " ) " + "ORDER BY p.priority ASC, p.id ASC"; Query query = em.createQuery(fetchQuery); //Query query = em.createNamedQuery("fetchQuery"); //query.setParameter("subsystem", subsystem); query.setMaxResults(1); Process p = (Process) query.getResultList().get(0); ProcessQueue pq = p.getProcessQueue(); p.use(); pq.incrementActive(); em.persist(p); em.persist(pq); return p; } @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public Process fetchProcess(int subsystem) { boolean failed = true; while (failed == true) { failed = false; try { return fetchProcess_real(subsystem); } catch (Exception e) { e.printStackTrace(); //failed = true; return null; } } return null; } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) private void releaseProcess_real(int id) { Process p = em.find(Process.class,id); CompletedProcess cp = new CompletedProcess(p); em.remove(p); em.persist(cp); } @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public void releaseProcess(int id) { releaseProcess_real(id); } @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public void releaseProcess(Process p) { releaseProcess_real(p.getId()); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) private void decreaseQueue_real(int id) { ProcessQueue pq = em.find(ProcessQueue.class, id); pq.decrementActive(); em.persist(pq); } @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public void decreaseQueue(int id) { boolean failed = true; while (failed == true) { failed = false; try { decreaseQueue_real(id); } catch (Exception e) { //failed = true; e.printStackTrace(); } } } @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public void completeProcess(int id) { releaseProcess(id); decreaseQueue(id); } @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public void completeProcess(Process p) { completeProcess(p.getId()); } @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public void doProcess(int subsystem) { int i = 0; Process p = null; System.out.println("doProcess: before entering the while"); while ((p = fetchProcess(subsystem)) != null) { i++; // do some work System.out.println("doProcess() - " + p); completeProcess(p.getId()); } System.out.println("doProcess: " + i + " process dequeued"); } }
And the exception
14:30:22,827 ERROR [STDERR] javax.persistence.TransactionRequiredException: EntityManager must be access within a transaction 14:30:22,828 ERROR [STDERR] at org.jboss.ejb3.entity.ManagedEntityManagerFactory.verifyInTx(ManagedEntityManagerFactory.java:150) 14:30:22,828 ERROR [STDERR] at org.jboss.ejb3.entity.TransactionScopedEntityManager.persist(TransactionScopedEntityManager.java:181) 14:30:22,828 ERROR [STDERR] at bps.ejb.BpsProcessQueueBean.fetchProcess_real(BpsProcessQueueBean.java:89) 14:30:22,829 ERROR [STDERR] at bps.ejb.BpsProcessQueueBean.fetchProcess(BpsProcessQueueBean.java:102) 14:30:22,829 ERROR [STDERR] at bps.ejb.BpsProcessQueueBean.doProcess(BpsProcessQueueBean.java:169) 14:30:22,829 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 14:30:22,830 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 14:30:22,830 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 14:30:22,830 ERROR [STDERR] at java.lang.reflect.Method.invoke(Method.java:585) 14:30:22,830 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112) 14:30:22,830 ERROR [STDERR] at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166) 14:30:22,831 ERROR [STDERR] at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63) 14:30:22,831 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,831 ERROR [STDERR] at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54) 14:30:22,831 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,831 ERROR [STDERR] at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47) 14:30:22,831 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,831 ERROR [STDERR] at org.jboss.aspects.tx.TxPolicy.invokeInNoTx(TxPolicy.java:66) 14:30:22,831 ERROR [STDERR] at org.jboss.aspects.tx.TxInterceptor$NotSupported.invoke(TxInterceptor.java:102) 14:30:22,832 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,833 ERROR [STDERR] at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76) 14:30:22,833 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,833 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62) 14:30:22,833 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,833 ERROR [STDERR] at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77) 14:30:22,833 ERROR [STDERR] at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:106) 14:30:22,834 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,834 ERROR [STDERR] at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46) 14:30:22,834 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,834 ERROR [STDERR] at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106) 14:30:22,834 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,834 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:278) 14:30:22,834 ERROR [STDERR] at org.jboss.ejb3.remoting.IsLocalInterceptor.invokeLocal(IsLocalInterceptor.java:79) 14:30:22,834 ERROR [STDERR] at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:70) 14:30:22,835 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,835 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:103) 14:30:22,835 ERROR [STDERR] at $Proxy187.doProcess(Unknown Source) 14:30:22,835 ERROR [STDERR] at bps.ejb.BpsAgent.onMessage(BpsAgent.java:34) 14:30:22,835 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 14:30:22,835 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 14:30:22,835 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 14:30:22,835 ERROR [STDERR] at java.lang.reflect.Method.invoke(Method.java:585) 14:30:22,835 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112) 14:30:22,836 ERROR [STDERR] at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166) 14:30:22,836 ERROR [STDERR] at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63) 14:30:22,836 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,836 ERROR [STDERR] at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54) 14:30:22,836 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,836 ERROR [STDERR] at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47) 14:30:22,836 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,836 ERROR [STDERR] at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:126) 14:30:22,837 ERROR [STDERR] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:195) 14:30:22,837 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,837 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62) 14:30:22,837 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 14:30:22,837 ERROR [STDERR] at org.jboss.ejb3.mdb.MessagingContainer.localInvoke(MessagingContainer.java:245) 14:30:22,837 ERROR [STDERR] at org.jboss.ejb3.mdb.inflow.MessageInflowLocalProxy.delivery(MessageInflowLocalProxy.java:268) 14:30:22,837 ERROR [STDERR] at org.jboss.ejb3.mdb.inflow.MessageInflowLocalProxy.invoke(MessageInflowLocalProxy.java:138) 14:30:22,837 ERROR [STDERR] at $Proxy182.onMessage(Unknown Source) 14:30:22,837 ERROR [STDERR] at org.jboss.resource.adapter.jms.inflow.JmsServerSession.onMessage(JmsServerSession.java:178) 14:30:22,838 ERROR [STDERR] at org.jboss.mq.SpyMessageConsumer.sessionConsumerProcessMessage(SpyMessageConsumer.java:891) 14:30:22,838 ERROR [STDERR] at org.jboss.mq.SpyMessageConsumer.addMessage(SpyMessageConsumer.java:170) 14:30:22,838 ERROR [STDERR] at org.jboss.mq.SpySession.run(SpySession.java:323) 14:30:22,838 ERROR [STDERR] at org.jboss.resource.adapter.jms.inflow.JmsServerSession.run(JmsServerSession.java:237) 14:30:22,838 ERROR [STDERR] at org.jboss.resource.work.WorkWrapper.execute(WorkWrapper.java:204) 14:30:22,838 ERROR [STDERR] at org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:275) 14:30:22,838 ERROR [STDERR] at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:743) 14:30:22,838 ERROR [STDERR] at java.lang.Thread.run(Thread.java:595)
before i tried to state the whole session bean as transactionattribute.NOT_SUPPORTED, and state REQUIRES_NEW only on the methods i wanted. but i got same error so i tried to specify for each method.