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
>