same for arquillian embedded adapter, tomee one is a real server adapter so
no hokk like it ;)

@Asynchronous uses its own thread so yes that's pby the issue

*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 John D. Ament <[email protected]>

> Reinis,
>
> If you use Arquillian + TomEE your tests will work much better (e.g. no
> thread issues).  YOu can run TomEE embedded so it's not too much slower
> either.  DeltaSpike is only a CDI library so it shouldn't impact your
> testing (so you're loading the libs up in to your WEB-INF/lib?)
>
> John
>
>
> On Wed, Apr 10, 2013 at 3:45 PM, Reinis Vicups <[email protected]> wrote:
>
> > Thanks Mr. Ament for your input!
> >
> > Yes I think I will go with Arquillian, although Mr. Struberg is
> persisting
> > (no pun) me to go with DeltaSpike.
> >
> > The Prod. Env. is ofcourse TomEE+
> >
> > I think that fully built application will even run in prod. env. but I
> > really want to test my app before deploying. One good reason in this
> > particular scenario is the "swallowed" exception especially if it could
> be
> > caused not because it's test setup but because am using @Asynchronous
> e.g.
> >
> > Thank you guys for the instant feedback, now I have to do some serious
> > Arquillian-re-factoring in my app o/
> > Reinis
> >
> >
> > On 04/10/2013 09:32 PM, John D. Ament wrote:
> >
> >> I would hope those interested in Application Composer also look at
> >> Arquillian for their automated testing needs (BTW: is your production
> >> target ENV just OpenEJB + OWB?)
> >>
> >> I think part of your issue is your use of @asynchronous.
> >>
> >>
> >> On Wed, Apr 10, 2013 at 3:28 PM, Reinis Vicups <[email protected]>
> wrote:
> >>
> >>    I guess, why is HeavyProcessingControllerProdu******cer session
> >>> scoped?
> >>>
> >>>  There
> >>>>
> >>>> is no HTTP Session when this unit test runs, so no it won't be active
> at
> >>>> that time.
> >>>>
> >>>>  Ok but why then the same session scoped bean is able to read from JPA
> >>> with
> >>> no issues two method calls before?
> >>>
> >>> As you may notice in stacktrace there's xyz.my.domain.User
> >>> (xyz.my.domain.User_$_****javassist_3.pcGetStateManager) This is the
> >>>
> >>> currently logged in user entity read from DB by JPA and passed up and
> >>> down
> >>> the stacktrace (injected or as param) in next to every method call.
> >>>
> >>> Reason why the HeavyProcessingControllerProdu****cer is session scoped
> >>> is
> >>>
> >>> that it produces stuff for currently logged in session user whether
> @New
> >>> or
> >>> existing.
> >>>
> >>> I understand your argument that theres no HTTP Session and it is
> obvious,
> >>> I just thought (am still hoping) that the ApplicationComposer does some
> >>> hard-core bootstrapping magic and weaves, javaasists or whatever dark
> >>> arts
> >>> are there required to allow me to junit-test all sorts of CDI/JSF/EJB
> >>> beans, no? :DDDD
> >>>
> >>> br
> >>> Reinis
> >>>
> >>>
> >>>
> >>> On 04/10/2013 09:14 PM, John D. Ament wrote:
> >>>
> >>>  What you're seeing is correct (though I'm not a good one to ask why
> it's
> >>>> only at the trace level that you see this exception).
> >>>>
> >>>> I guess, why is HeavyProcessingControllerProdu******cer session
> scoped?
> >>>>
> >>>> There
> >>>>
> >>>> is no HTTP Session when this unit test runs, so no it won't be active
> at
> >>>> that time.
> >>>>
> >>>>
> >>>> On Wed, Apr 10, 2013 at 3:00 PM, Reinis Vicups <[email protected]>
> >>>> wrote:
> >>>>
> >>>>   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