You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by "Bonhold, Erwin" <er...@atos.net> on 2012/02/17 10:42:21 UTC
CODI+OWB+Scheduler, ContextNotActiveException
Hi all,
at first, CDI + CODI is really cool stuff for building a webapp.
1) Our Environment:
We are using OWB 1.1.3, CODI 1.0.2 on a Tomcat 7 environment with CODI @Transactional.
Database Producer:
@PersistenceContext(unitName = "myunit")
private EntityManager extendedEntityManager;
@Produces
@ConversationScoped
@MyQualifier
public ExtendedEntityManager createExtendedEntityManager() {
return new ExtendedEntityManager(this.extendedEntityManager);
}
public void dispose(@Disposes @Siemens ExtendedEntityManager extendedEntityManager) {
if (extendedEntityManager.isOpen()) {
extendedEntityManager.close();
}
}
-DatabaseService which gets above EntityManager injected
-OtherServices which getting the database Service injected
2) The Problem:
Using Quartz, Seam Cron or the following class, which creates a thread, leads into the same problem.
@ApplicationScoped
public class ApplicationTimer {
@Inject
private Log log;
@Inject
private OtherService otherService; // gets databaseService injected, databaseService gets EntityManager injected
public void init() {
log.info("initialize timer thread");
try {
otherService.doSomething(); // WORKS in Context of this ApplicationScoped bean
} catch (Exception e) {
log.error(e);
}
Thread timer = new Thread() {
public void run() {
while (true) {
log.info("That's the thread");
try {
otherService.doSomething(); // EXCEPTION occurs in Child Thread
Thread.sleep(5000);
} catch (Exception e) {
log.error(e);
}
}
}
};
timer.start();
}
}
An exception
javax.enterprise.context.ContextNotActiveException: WebBeans context with scope type annotation @ConversationScoped does not exist within current thread
occurs
We also tried to start a (javax) Conversation. Leads into the same Excpetion with ... a @RequestScoped does not exist.
The child thread is not in context of a web request, we guess the EntityManager have to (as descriped in CODI doc).
But how to solve this problem?
Is there a possibility to create/provide an appropriate context to the child thread or to start scheduled services in another way?
Best Regards
Erwin
Re: CODI+OWB+Scheduler, ContextNotActiveException
Posted by Mark Struberg <st...@yahoo.de>.
Hi Manuel!
Asynchronous Servlet requests are a bit different than manually forking a new Thread.
Neither OWB nor Weld use asyncSupported atm.
The CDI EG is already discussing this feature and I guess we will add official support for it in CDI-1.1.
LieGrue,
strub
----- Original Message -----
> From: Manuel Hartl <ma...@kobil.com>
> To: MyFaces Discussion <us...@myfaces.apache.org>
> Cc:
> Sent: Friday, February 17, 2012 11:40 AM
> Subject: Re: CODI+OWB+Scheduler, ContextNotActiveException
>
> Hi Mark,
>
> i would slightly disagree to that.
>
> i think it should at least be possible to use Request and SessionScope
> during an AsyncContext of servlet api 3. This AsyncContext is somehow
> associated to a specific servlet request and so IMHO Request- and
> Session-Scopes could be provided.
>
> Greetings,
> Manuel.
>
>
>> In fact, asynchronous tasks should not even rely on @SessionScoped or
> @RequestScoped because they do not exist outside a servlet request ;)
>>
>> LieGrue,
>> strub
>>
>>
>>
>> ----- Original Message -----
>>> From: Gerhard Petracek <ge...@gmail.com>
>>> To: MyFaces Discussion <us...@myfaces.apache.org>
>>> Cc:
>>> Sent: Friday, February 17, 2012 10:58 AM
>>> Subject: Re: CODI+OWB+Scheduler, ContextNotActiveException
>>>
>>> hi erwin,
>>>
>>> first of all: welcome @ myfaces!
>>>
>>> for a conversation a window is needed. therefore, the current
> conversation
>>> can't be resolved outside of a faces request.
>>> since it's possible to destroy the window-context at any time, it
> isn't
>>> suggested to use such scopes in an asynchronous task at all.
>>>
>>> regards,
>>> gerhard
>>>
>>> http://www.irian.at
>>>
>>> Your JSF/JavaEE powerhouse -
>>> JavaEE Consulting, Development and
>>> Courses in English and German
>>>
>>> Professional Support for Apache MyFaces
>>>
>>>
>>>
>>> 2012/2/17 Bonhold, Erwin <er...@atos.net>
>>>
>>>> Hi all,
>>>>
>>>> at first, CDI + CODI is really cool stuff for building a webapp.
>>>>
>>>> 1) Our Environment:
>>>> We are using OWB 1.1.3, CODI 1.0.2 on a Tomcat 7 environment with
> CODI
>>>> @Transactional.
>>>>
>>>> Database Producer:
>>>> @PersistenceContext(unitName = "myunit")
>>>> private EntityManager extendedEntityManager;
>>>>
>>>> @Produces
>>>> @ConversationScoped
>>>> @MyQualifier
>>>> public ExtendedEntityManager createExtendedEntityManager() {
>>>> return new ExtendedEntityManager(this.extendedEntityManager);
>>>> }
>>>>
>>>> public void dispose(@Disposes @Siemens ExtendedEntityManager
>>>> extendedEntityManager) {
>>>> if (extendedEntityManager.isOpen()) {
>>>> extendedEntityManager.close();
>>>> }
>>>> }
>>>>
>>>> -DatabaseService which gets above EntityManager injected
>>>> -OtherServices which getting the database Service injected
>>>>
>>>>
>>>> 2) The Problem:
>>>> Using Quartz, Seam Cron or the following class, which creates a
> thread,
>>>> leads into the same problem.
>>>>
>>>> @ApplicationScoped
>>>> public class ApplicationTimer {
>>>>
>>>> @Inject
>>>> private Log log;
>>>>
>>>> @Inject
>>>> private OtherService otherService; // gets databaseService
> injected,
>>>> databaseService gets EntityManager injected
>>>>
>>>> public void init() {
>>>> log.info("initialize timer thread");
>>>> try {
>>>> otherService.doSomething(); // WORKS in Context of this
>>>> ApplicationScoped bean
>>>> } catch (Exception e) {
>>>> log.error(e);
>>>> }
>>>>
>>>> Thread timer = new Thread() {
>>>> public void run() {
>>>> while (true) {
>>>> log.info("That's the thread");
>>>> try {
>>>> otherService.doSomething(); // EXCEPTION occurs in Child
> Thread
>>>> Thread.sleep(5000);
>>>> } catch (Exception e) {
>>>> log.error(e);
>>>> }
>>>> }
>>>> }
>>>> };
>>>> timer.start();
>>>> }
>>>> }
>>>>
>>>> An exception
>>>> javax.enterprise.context.ContextNotActiveException: WebBeans
> context with
>>>> scope type annotation @ConversationScoped does not exist within
> current
>>>> thread
>>>> occurs
>>>>
>>>> We also tried to start a (javax) Conversation. Leads into the same
>>>> Excpetion with ... a @RequestScoped does not exist.
>>>>
>>>> The child thread is not in context of a web request, we guess the
>>>> EntityManager have to (as descriped in CODI doc).
>>>>
>>>> But how to solve this problem?
>>>> Is there a possibility to create/provide an appropriate context to
> the
>>>> child thread or to start scheduled services in another way?
>>>>
>>>>
>>>> Best Regards
>>>> Erwin
>>>>
>
>
> --
> Dipl. Inform. Manuel Hartl
> Software Architect
>
> FlexSecure-Logo KobilGroup-Logo
>
> FlexSecure GmbH
> Industriestr. 12
> D - 64297 Darmstadt
> Tel: +49 (0) 6151 501 23-18
> Fax: +49 (0) 6151 501 23-19
>
> E-Mail: hartl@flexsecure.de
> Internet: www.flexsecure.de
>
> Geschäftsführer:
> Erwin Stallenberger, Markus Ruppert
>
> Amtsgericht Darmstadt HRB 8036
> Umsatzsteuernummer: DE 214745269
>
Re: CODI+OWB+Scheduler, ContextNotActiveException
Posted by Manuel Hartl <ma...@kobil.com>.
Hi Mark,
i would slightly disagree to that.
i think it should at least be possible to use Request and SessionScope
during an AsyncContext of servlet api 3. This AsyncContext is somehow
associated to a specific servlet request and so IMHO Request- and
Session-Scopes could be provided.
Greetings,
Manuel.
> In fact, asynchronous tasks should not even rely on @SessionScoped or @RequestScoped because they do not exist outside a servlet request ;)
>
> LieGrue,
> strub
>
>
>
> ----- Original Message -----
>> From: Gerhard Petracek <ge...@gmail.com>
>> To: MyFaces Discussion <us...@myfaces.apache.org>
>> Cc:
>> Sent: Friday, February 17, 2012 10:58 AM
>> Subject: Re: CODI+OWB+Scheduler, ContextNotActiveException
>>
>> hi erwin,
>>
>> first of all: welcome @ myfaces!
>>
>> for a conversation a window is needed. therefore, the current conversation
>> can't be resolved outside of a faces request.
>> since it's possible to destroy the window-context at any time, it isn't
>> suggested to use such scopes in an asynchronous task at all.
>>
>> regards,
>> gerhard
>>
>> http://www.irian.at
>>
>> Your JSF/JavaEE powerhouse -
>> JavaEE Consulting, Development and
>> Courses in English and German
>>
>> Professional Support for Apache MyFaces
>>
>>
>>
>> 2012/2/17 Bonhold, Erwin <er...@atos.net>
>>
>>> Hi all,
>>>
>>> at first, CDI + CODI is really cool stuff for building a webapp.
>>>
>>> 1) Our Environment:
>>> We are using OWB 1.1.3, CODI 1.0.2 on a Tomcat 7 environment with CODI
>>> @Transactional.
>>>
>>> Database Producer:
>>> @PersistenceContext(unitName = "myunit")
>>> private EntityManager extendedEntityManager;
>>>
>>> @Produces
>>> @ConversationScoped
>>> @MyQualifier
>>> public ExtendedEntityManager createExtendedEntityManager() {
>>> return new ExtendedEntityManager(this.extendedEntityManager);
>>> }
>>>
>>> public void dispose(@Disposes @Siemens ExtendedEntityManager
>>> extendedEntityManager) {
>>> if (extendedEntityManager.isOpen()) {
>>> extendedEntityManager.close();
>>> }
>>> }
>>>
>>> -DatabaseService which gets above EntityManager injected
>>> -OtherServices which getting the database Service injected
>>>
>>>
>>> 2) The Problem:
>>> Using Quartz, Seam Cron or the following class, which creates a thread,
>>> leads into the same problem.
>>>
>>> @ApplicationScoped
>>> public class ApplicationTimer {
>>>
>>> @Inject
>>> private Log log;
>>>
>>> @Inject
>>> private OtherService otherService; // gets databaseService injected,
>>> databaseService gets EntityManager injected
>>>
>>> public void init() {
>>> log.info("initialize timer thread");
>>> try {
>>> otherService.doSomething(); // WORKS in Context of this
>>> ApplicationScoped bean
>>> } catch (Exception e) {
>>> log.error(e);
>>> }
>>>
>>> Thread timer = new Thread() {
>>> public void run() {
>>> while (true) {
>>> log.info("That's the thread");
>>> try {
>>> otherService.doSomething(); // EXCEPTION occurs in Child Thread
>>> Thread.sleep(5000);
>>> } catch (Exception e) {
>>> log.error(e);
>>> }
>>> }
>>> }
>>> };
>>> timer.start();
>>> }
>>> }
>>>
>>> An exception
>>> javax.enterprise.context.ContextNotActiveException: WebBeans context with
>>> scope type annotation @ConversationScoped does not exist within current
>>> thread
>>> occurs
>>>
>>> We also tried to start a (javax) Conversation. Leads into the same
>>> Excpetion with ... a @RequestScoped does not exist.
>>>
>>> The child thread is not in context of a web request, we guess the
>>> EntityManager have to (as descriped in CODI doc).
>>>
>>> But how to solve this problem?
>>> Is there a possibility to create/provide an appropriate context to the
>>> child thread or to start scheduled services in another way?
>>>
>>>
>>> Best Regards
>>> Erwin
>>>
--
Dipl. Inform. Manuel Hartl
Software Architect
FlexSecure-Logo KobilGroup-Logo
FlexSecure GmbH
Industriestr. 12
D - 64297 Darmstadt
Tel: +49 (0) 6151 501 23-18
Fax: +49 (0) 6151 501 23-19
E-Mail: hartl@flexsecure.de
Internet: www.flexsecure.de
Geschäftsführer:
Erwin Stallenberger, Markus Ruppert
Amtsgericht Darmstadt HRB 8036
Umsatzsteuernummer: DE 214745269
Re: CODI+OWB+Scheduler, ContextNotActiveException
Posted by Manuel Hartl <ma...@kobil.com>.
Hi Mark,
i would slightly disagree to that.
i think it should at least be possible to use Request and SessionScope
during an AsyncContext of servlet api 3. This AsyncContext is somehow
associated to a specific servlet request and so IMHO Request- and
Session-Scopes could be provided.
Greetings,
Manuel.
> In fact, asynchronous tasks should not even rely on @SessionScoped or @RequestScoped because they do not exist outside a servlet request ;)
>
> LieGrue,
> strub
>
>
>
> ----- Original Message -----
>> From: Gerhard Petracek <ge...@gmail.com>
>> To: MyFaces Discussion <us...@myfaces.apache.org>
>> Cc:
>> Sent: Friday, February 17, 2012 10:58 AM
>> Subject: Re: CODI+OWB+Scheduler, ContextNotActiveException
>>
>> hi erwin,
>>
>> first of all: welcome @ myfaces!
>>
>> for a conversation a window is needed. therefore, the current conversation
>> can't be resolved outside of a faces request.
>> since it's possible to destroy the window-context at any time, it isn't
>> suggested to use such scopes in an asynchronous task at all.
>>
>> regards,
>> gerhard
>>
>> http://www.irian.at
>>
>> Your JSF/JavaEE powerhouse -
>> JavaEE Consulting, Development and
>> Courses in English and German
>>
>> Professional Support for Apache MyFaces
>>
>>
>>
>> 2012/2/17 Bonhold, Erwin <er...@atos.net>
>>
>>> Hi all,
>>>
>>> at first, CDI + CODI is really cool stuff for building a webapp.
>>>
>>> 1) Our Environment:
>>> We are using OWB 1.1.3, CODI 1.0.2 on a Tomcat 7 environment with CODI
>>> @Transactional.
>>>
>>> Database Producer:
>>> @PersistenceContext(unitName = "myunit")
>>> private EntityManager extendedEntityManager;
>>>
>>> @Produces
>>> @ConversationScoped
>>> @MyQualifier
>>> public ExtendedEntityManager createExtendedEntityManager() {
>>> return new ExtendedEntityManager(this.extendedEntityManager);
>>> }
>>>
>>> public void dispose(@Disposes @Siemens ExtendedEntityManager
>>> extendedEntityManager) {
>>> if (extendedEntityManager.isOpen()) {
>>> extendedEntityManager.close();
>>> }
>>> }
>>>
>>> -DatabaseService which gets above EntityManager injected
>>> -OtherServices which getting the database Service injected
>>>
>>>
>>> 2) The Problem:
>>> Using Quartz, Seam Cron or the following class, which creates a thread,
>>> leads into the same problem.
>>>
>>> @ApplicationScoped
>>> public class ApplicationTimer {
>>>
>>> @Inject
>>> private Log log;
>>>
>>> @Inject
>>> private OtherService otherService; // gets databaseService injected,
>>> databaseService gets EntityManager injected
>>>
>>> public void init() {
>>> log.info("initialize timer thread");
>>> try {
>>> otherService.doSomething(); // WORKS in Context of this
>>> ApplicationScoped bean
>>> } catch (Exception e) {
>>> log.error(e);
>>> }
>>>
>>> Thread timer = new Thread() {
>>> public void run() {
>>> while (true) {
>>> log.info("That's the thread");
>>> try {
>>> otherService.doSomething(); // EXCEPTION occurs in Child Thread
>>> Thread.sleep(5000);
>>> } catch (Exception e) {
>>> log.error(e);
>>> }
>>> }
>>> }
>>> };
>>> timer.start();
>>> }
>>> }
>>>
>>> An exception
>>> javax.enterprise.context.ContextNotActiveException: WebBeans context with
>>> scope type annotation @ConversationScoped does not exist within current
>>> thread
>>> occurs
>>>
>>> We also tried to start a (javax) Conversation. Leads into the same
>>> Excpetion with ... a @RequestScoped does not exist.
>>>
>>> The child thread is not in context of a web request, we guess the
>>> EntityManager have to (as descriped in CODI doc).
>>>
>>> But how to solve this problem?
>>> Is there a possibility to create/provide an appropriate context to the
>>> child thread or to start scheduled services in another way?
>>>
>>>
>>> Best Regards
>>> Erwin
>>>
--
Dipl. Inform. Manuel Hartl
Software Architect
FlexSecure-Logo KobilGroup-Logo
FlexSecure GmbH
Industriestr. 12
D - 64297 Darmstadt
Tel: +49 (0) 6151 501 23-18
Fax: +49 (0) 6151 501 23-19
E-Mail: hartl@flexsecure.de
Internet: www.flexsecure.de
Geschäftsführer:
Erwin Stallenberger, Markus Ruppert
Amtsgericht Darmstadt HRB 8036
Umsatzsteuernummer: DE 214745269
Re: CODI+OWB+Scheduler, ContextNotActiveException
Posted by Mark Struberg <st...@yahoo.de>.
In fact, asynchronous tasks should not even rely on @SessionScoped or @RequestScoped because they do not exist outside a servlet request ;)
LieGrue,
strub
----- Original Message -----
> From: Gerhard Petracek <ge...@gmail.com>
> To: MyFaces Discussion <us...@myfaces.apache.org>
> Cc:
> Sent: Friday, February 17, 2012 10:58 AM
> Subject: Re: CODI+OWB+Scheduler, ContextNotActiveException
>
> hi erwin,
>
> first of all: welcome @ myfaces!
>
> for a conversation a window is needed. therefore, the current conversation
> can't be resolved outside of a faces request.
> since it's possible to destroy the window-context at any time, it isn't
> suggested to use such scopes in an asynchronous task at all.
>
> regards,
> gerhard
>
> http://www.irian.at
>
> Your JSF/JavaEE powerhouse -
> JavaEE Consulting, Development and
> Courses in English and German
>
> Professional Support for Apache MyFaces
>
>
>
> 2012/2/17 Bonhold, Erwin <er...@atos.net>
>
>> Hi all,
>>
>> at first, CDI + CODI is really cool stuff for building a webapp.
>>
>> 1) Our Environment:
>> We are using OWB 1.1.3, CODI 1.0.2 on a Tomcat 7 environment with CODI
>> @Transactional.
>>
>> Database Producer:
>> @PersistenceContext(unitName = "myunit")
>> private EntityManager extendedEntityManager;
>>
>> @Produces
>> @ConversationScoped
>> @MyQualifier
>> public ExtendedEntityManager createExtendedEntityManager() {
>> return new ExtendedEntityManager(this.extendedEntityManager);
>> }
>>
>> public void dispose(@Disposes @Siemens ExtendedEntityManager
>> extendedEntityManager) {
>> if (extendedEntityManager.isOpen()) {
>> extendedEntityManager.close();
>> }
>> }
>>
>> -DatabaseService which gets above EntityManager injected
>> -OtherServices which getting the database Service injected
>>
>>
>> 2) The Problem:
>> Using Quartz, Seam Cron or the following class, which creates a thread,
>> leads into the same problem.
>>
>> @ApplicationScoped
>> public class ApplicationTimer {
>>
>> @Inject
>> private Log log;
>>
>> @Inject
>> private OtherService otherService; // gets databaseService injected,
>> databaseService gets EntityManager injected
>>
>> public void init() {
>> log.info("initialize timer thread");
>> try {
>> otherService.doSomething(); // WORKS in Context of this
>> ApplicationScoped bean
>> } catch (Exception e) {
>> log.error(e);
>> }
>>
>> Thread timer = new Thread() {
>> public void run() {
>> while (true) {
>> log.info("That's the thread");
>> try {
>> otherService.doSomething(); // EXCEPTION occurs in Child Thread
>> Thread.sleep(5000);
>> } catch (Exception e) {
>> log.error(e);
>> }
>> }
>> }
>> };
>> timer.start();
>> }
>> }
>>
>> An exception
>> javax.enterprise.context.ContextNotActiveException: WebBeans context with
>> scope type annotation @ConversationScoped does not exist within current
>> thread
>> occurs
>>
>> We also tried to start a (javax) Conversation. Leads into the same
>> Excpetion with ... a @RequestScoped does not exist.
>>
>> The child thread is not in context of a web request, we guess the
>> EntityManager have to (as descriped in CODI doc).
>>
>> But how to solve this problem?
>> Is there a possibility to create/provide an appropriate context to the
>> child thread or to start scheduled services in another way?
>>
>>
>> Best Regards
>> Erwin
>>
>
Re: CODI+OWB+Scheduler, ContextNotActiveException
Posted by Gerhard Petracek <ge...@gmail.com>.
short addition:
just store all information which are needed to process the task in a
storage which is valid outside of requests.
+ you can use e.g. @TransactionScoped (since codi 1.0.4 it also works
outside of requests.)
regards,
gerhard
http://www.irian.at
Your JSF/JavaEE powerhouse -
JavaEE Consulting, Development and
Courses in English and German
Professional Support for Apache MyFaces
2012/2/17 Gerhard Petracek <ge...@gmail.com>
> hi erwin,
>
> first of all: welcome @ myfaces!
>
> for a conversation a window is needed. therefore, the current conversation
> can't be resolved outside of a faces request.
> since it's possible to destroy the window-context at any time, it isn't
> suggested to use such scopes in an asynchronous task at all.
>
> regards,
> gerhard
>
> http://www.irian.at
>
> Your JSF/JavaEE powerhouse -
> JavaEE Consulting, Development and
> Courses in English and German
>
> Professional Support for Apache MyFaces
>
>
>
> 2012/2/17 Bonhold, Erwin <er...@atos.net>
>
> Hi all,
>>
>> at first, CDI + CODI is really cool stuff for building a webapp.
>>
>> 1) Our Environment:
>> We are using OWB 1.1.3, CODI 1.0.2 on a Tomcat 7 environment with CODI
>> @Transactional.
>>
>> Database Producer:
>> @PersistenceContext(unitName = "myunit")
>> private EntityManager extendedEntityManager;
>>
>> @Produces
>> @ConversationScoped
>> @MyQualifier
>> public ExtendedEntityManager createExtendedEntityManager() {
>> return new ExtendedEntityManager(this.extendedEntityManager);
>> }
>>
>> public void dispose(@Disposes @Siemens ExtendedEntityManager
>> extendedEntityManager) {
>> if (extendedEntityManager.isOpen()) {
>> extendedEntityManager.close();
>> }
>> }
>>
>> -DatabaseService which gets above EntityManager injected
>> -OtherServices which getting the database Service injected
>>
>>
>> 2) The Problem:
>> Using Quartz, Seam Cron or the following class, which creates a thread,
>> leads into the same problem.
>>
>> @ApplicationScoped
>> public class ApplicationTimer {
>>
>> @Inject
>> private Log log;
>>
>> @Inject
>> private OtherService otherService; // gets databaseService injected,
>> databaseService gets EntityManager injected
>>
>> public void init() {
>> log.info("initialize timer thread");
>> try {
>> otherService.doSomething(); // WORKS in Context of this
>> ApplicationScoped bean
>> } catch (Exception e) {
>> log.error(e);
>> }
>>
>> Thread timer = new Thread() {
>> public void run() {
>> while (true) {
>> log.info("That's the thread");
>> try {
>> otherService.doSomething(); // EXCEPTION occurs in Child Thread
>> Thread.sleep(5000);
>> } catch (Exception e) {
>> log.error(e);
>> }
>> }
>> }
>> };
>> timer.start();
>> }
>> }
>>
>> An exception
>> javax.enterprise.context.ContextNotActiveException: WebBeans context with
>> scope type annotation @ConversationScoped does not exist within current
>> thread
>> occurs
>>
>> We also tried to start a (javax) Conversation. Leads into the same
>> Excpetion with ... a @RequestScoped does not exist.
>>
>> The child thread is not in context of a web request, we guess the
>> EntityManager have to (as descriped in CODI doc).
>>
>> But how to solve this problem?
>> Is there a possibility to create/provide an appropriate context to the
>> child thread or to start scheduled services in another way?
>>
>>
>> Best Regards
>> Erwin
>>
>
>
Re: CODI+OWB+Scheduler, ContextNotActiveException
Posted by Gerhard Petracek <ge...@gmail.com>.
hi erwin,
first of all: welcome @ myfaces!
for a conversation a window is needed. therefore, the current conversation
can't be resolved outside of a faces request.
since it's possible to destroy the window-context at any time, it isn't
suggested to use such scopes in an asynchronous task at all.
regards,
gerhard
http://www.irian.at
Your JSF/JavaEE powerhouse -
JavaEE Consulting, Development and
Courses in English and German
Professional Support for Apache MyFaces
2012/2/17 Bonhold, Erwin <er...@atos.net>
> Hi all,
>
> at first, CDI + CODI is really cool stuff for building a webapp.
>
> 1) Our Environment:
> We are using OWB 1.1.3, CODI 1.0.2 on a Tomcat 7 environment with CODI
> @Transactional.
>
> Database Producer:
> @PersistenceContext(unitName = "myunit")
> private EntityManager extendedEntityManager;
>
> @Produces
> @ConversationScoped
> @MyQualifier
> public ExtendedEntityManager createExtendedEntityManager() {
> return new ExtendedEntityManager(this.extendedEntityManager);
> }
>
> public void dispose(@Disposes @Siemens ExtendedEntityManager
> extendedEntityManager) {
> if (extendedEntityManager.isOpen()) {
> extendedEntityManager.close();
> }
> }
>
> -DatabaseService which gets above EntityManager injected
> -OtherServices which getting the database Service injected
>
>
> 2) The Problem:
> Using Quartz, Seam Cron or the following class, which creates a thread,
> leads into the same problem.
>
> @ApplicationScoped
> public class ApplicationTimer {
>
> @Inject
> private Log log;
>
> @Inject
> private OtherService otherService; // gets databaseService injected,
> databaseService gets EntityManager injected
>
> public void init() {
> log.info("initialize timer thread");
> try {
> otherService.doSomething(); // WORKS in Context of this
> ApplicationScoped bean
> } catch (Exception e) {
> log.error(e);
> }
>
> Thread timer = new Thread() {
> public void run() {
> while (true) {
> log.info("That's the thread");
> try {
> otherService.doSomething(); // EXCEPTION occurs in Child Thread
> Thread.sleep(5000);
> } catch (Exception e) {
> log.error(e);
> }
> }
> }
> };
> timer.start();
> }
> }
>
> An exception
> javax.enterprise.context.ContextNotActiveException: WebBeans context with
> scope type annotation @ConversationScoped does not exist within current
> thread
> occurs
>
> We also tried to start a (javax) Conversation. Leads into the same
> Excpetion with ... a @RequestScoped does not exist.
>
> The child thread is not in context of a web request, we guess the
> EntityManager have to (as descriped in CODI doc).
>
> But how to solve this problem?
> Is there a possibility to create/provide an appropriate context to the
> child thread or to start scheduled services in another way?
>
>
> Best Regards
> Erwin
>