Hi guys,

got following scenario

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

@org.junit.runner.RunWith(org.apache.openejb.junit.ApplicationComposer)
public class IamIntegrationTest{

    // ACHTUNG!
@javax.enterprise.inject.Produces @javax.enterprise.inject.New
    HeavyProcessingController heavyProcessingController;

    @org.apache.openejb.testing.Module
    public PersistenceUnit somePersistenceConfigHere() {
        // boring code
    }

    @org.apache.openejb.testing.Configuration
    public Properties settingUpSomeRessourceConfig() {
        // boring code
    }

    @Test
    public void iAmHeavyIntegrationTestMethod() {
        heavyProcessingController.readALittleBitFromJPA();
heavyProcessingController.initiateSomeHeavyProcessing();
    }
} // end test class


@javax.enterprise.context.SessionScoped
public class HeavyProcessingControllerProducer {

    @Inject
    JPAService jpaService;

    @Produces @RequestScoped
    public List<SomeEntity> readALittleBitFromJPA() {
jpaService.getEntityList();
    }

    @javax.enterprise.inject.Produces @javax.enterprise.inject.New
    public HeavyProcessingControllerproduceHeavyProcessingController() {

        // ACHTUNG, invoking here JPA and it works!
readALittleBitFromJPA();

// ACHTUNG, doing this because of some complex initialization logic required aforehand. return org.apache.myfaces.extensions.cdi.core.impl.util.CodiUtils.getContextualReferenceByClass(HeavyProcessingController.class);
    }
} // end Producer class


// ACHTUNG, this is stateful EJB Bean with no other explicit context annotations!
@javax.ejb.Stateful
public class HeavyProcessingController implements Serializable {

    @Inject
    AsyncHeavyProcessingWorker asyncWorker;

    public void initiateSomeHeavyProcessing() {
        // ACHTUNG! @Asynchronous method is invoked here
        asyncWorker.asyncDoHeavyProcessingAndSaveYourWorkIntoPersistence();
    }
}


// ACHTUNG, this is stateful EJB Bean with no other explicit context annotations!
@javax.ejb.Stateful
public class AsyncHeavyProcessingWorkerimplements Serializable {

    @Inject
    JPAService jpaService;

    @Asynchronous
    public void asyncDoHeavyProcessingAndSaveYourWorkIntoPersistence(){
        // ACHTUNG!
jpaService.persist(allThatHardWork);
    }
}

@javax.ejb.Stateless
public class JPAService {

    @PersistenceContext
    EntityManager em;

    // ACHTUNG, no explicit TransacactionAttribute, using defaults!
    public void persist(SomeJPAEntity allThatHardWork) {
em.persist(allThatHardWork);
    } <- ACHTUNG, exceptionsomewhere here!
}

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Executing this code causes following exception:


3389 default TRACE [@Asynchronous IntegrationTest - 1] openjpa.Runtime - org.apache.openjpa.persistence.EntityManagerFactoryImpl@51d62781 created EntityManager org.apache.openjpa.persistence.EntityManagerImpl@5ead44a4. 123394 default TRACE [@Asynchronous IntegrationTest - 1] openjpa.Runtime - An exception occurred while ending the transaction. This exception will be re-thrown. javax.enterprise.context.ContextNotActiveException: WebBeans context with scope type annotation @SessionScoped does not exist within current thread at org.apache.webbeans.container.BeanManagerImpl.getContext(BeanManagerImpl.java:351) at org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.getContextualInstance(NormalScopedBeanInterceptorHandler.java:143) at org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.invoke(NormalScopedBeanInterceptorHandler.java:114) at org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.invoke(NormalScopedBeanInterceptorHandler.java:108) *_at xyz.my.domain.User_$$_javassist_3.pcGetStateManager(User_$$_javassist_3.java)_* at org.apache.openjpa.kernel.BrokerImpl.isDetached(BrokerImpl.java:4580) at org.apache.openjpa.kernel.SingleFieldManager.preFlushPC(SingleFieldManager.java:775) at org.apache.openjpa.kernel.SingleFieldManager.preFlush(SingleFieldManager.java:621) at org.apache.openjpa.kernel.SingleFieldManager.preFlush(SingleFieldManager.java:589) at org.apache.openjpa.kernel.SingleFieldManager.preFlush(SingleFieldManager.java:505) at org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2982)
    at org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:40)
at org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1054)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2112)
at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2072) at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1990) at org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:527) at org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:512) at org.apache.geronimo.transaction.manager.TransactionImpl.beforePrepare(TransactionImpl.java:413) at org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:262) at org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:252) at org.apache.openejb.core.transaction.JtaTransactionPolicy.completeTransaction(JtaTransactionPolicy.java:328) at org.apache.openejb.core.transaction.TxRequired.commit(TxRequired.java:75) at org.apache.openejb.core.transaction.EjbTransactionUtil.afterInvoke(EjbTransactionUtil.java:76) at org.apache.openejb.core.stateful.StatefulContainer.afterInvoke(StatefulContainer.java:843) at org.apache.openejb.core.stateful.StatefulContainer.businessMethod(StatefulContainer.java:667) at org.apache.openejb.core.stateful.StatefulContainer.invoke(StatefulContainer.java:364) at org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:256) at org.apache.openejb.core.ivm.EjbObjectProxyHandler$1.call(EjbObjectProxyHandler.java:244) at org.apache.openejb.async.AsynchronousPool$AsynchronousCall.call(AsynchronousPool.java:110)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
WARNING - Could NOT lazily initialize session context because NO active request context 123395 default TRACE [@Asynchronous IntegrationTest - 1] openjpa.Runtime - [email protected]() invoked.

I have following questions:

1.Why is that this exception is logged ONLY when setting openjpa.log to Runtime=TRACE? In other cases it's "swallowed" (as in there's no exception thrown in jpaService.persist(allThatHardWork);)

2. Why is this exception? I already access JPA from @SessionScoped bean in HeavyProcessingControllerProducer.produceHeavyProcessingController() when I readALittleBitFromJPA() and it reads from Database just fine.

3. If you care to comment on the design of those classes, I would love to here if it's ok or not

Thanks guys for reading this lengthy e-mail and even more thanks if you give your thought on this
Reinis.

Reply via email to