That is poopery, is there any alternative approach available (such as bootstrapping separate container in async worker merging entities back in and then persisting or just selecting different test-framework?)

Would love to hear some good practice instead of chaotically trying different approaches :D

thanks, Romain!
Reinis


On 04/10/2013 09:23 PM, Romain Manni-Bucau wrote:
request and session scopes are active for a single thread (the test one) in
unit test

*Romain Manni-Bucau*
*Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
*Blog: **http://rmannibucau.wordpress.com/*<http://rmannibucau.wordpress.com/>
*LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
*Github: https://github.com/rmannibucau*



2013/4/10 Reinis Vicups <[email protected]>

Hi,

these are TEH relevant jars I think:

cditest-*-1.1.7.jar
myfaces-extcdi-*-1.0.5.jar
mysql-connector-java-5.1.24.**jar
openejb-javaagent-4.5.2.jar
openejb-*-4.6.0-SNAPSHOT.jar
openwebbeans-spi-1.1.7.jar
openwebbeans-impl-1.1.7.jar
javaee-api-6.0-5.jar
openwebbeans-ejb-1.1.8.jar
openwebbeans-ee-*-1.1.8.jar
openjpa-2.2.0.jar

br
Reinis


On 04/10/2013 09:05 PM, Romain Manni-Bucau wrote:

Hi,

which version? did you try the snapshot?


*Romain Manni-Bucau*
*Twitter: @rmannibucau 
<https://twitter.com/**rmannibucau<https://twitter.com/rmannibucau>
*
*Blog: 
**http://rmannibucau.**wordpress.com/*<http://rmannibucau.wordpress.com/*>
<http://**rmannibucau.wordpress.com/ <http://rmannibucau.wordpress.com/>>
*LinkedIn: 
**http://fr.linkedin.com/in/**rmannibucau*<http://fr.linkedin.com/in/rmannibucau*>
*Github: https://github.com/**rmannibucau*<https://github.com/rmannibucau*>



2013/4/10 Reinis Vicups <[email protected]>

  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 HeavyProcessingControllerProdu****cer {

      @Inject
      JPAService jpaService;

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

      @javax.enterprise.inject.****Produces @javax.enterprise.inject.New
      public HeavyProcessingControllerprodu**
**ceHeavyProcessingController(**) {


          // 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.****asyncDoHeavyProcessingAndSaveY****
ourWorkIntoPersistence();

      }
}


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

      @Inject
      JPAService jpaService;

      @Asynchronous
      public void asyncDoHeavyProcessingAndSaveY**
**ourWorkIntoPersistence(){
          // 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.******
NormalScopedBeanInterceptorHan****
dler.getContextualInstance(****NormalScopedBeanInterceptorHan****
dler.java:143)
      at org.apache.webbeans.intercept.******
NormalScopedBeanInterceptorHan****
dler.invoke(****NormalScopedBeanInterceptorHan****dler.java:114)
      at org.apache.webbeans.intercept.******
NormalScopedBeanInterceptorHan****
dler.invoke(****NormalScopedBeanInterceptorHan****dler.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 - org.apache.openjpa.****persistence.EntityManagerImpl@*
***5ead44a4.close()

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
HeavyProcessingControllerProdu****cer.****produceHeavyProcessingControll
****er()

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