myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gerhard Petracek <gerhard.petra...@gmail.com>
Subject Re: CODI+OWB+Scheduler, ContextNotActiveException
Date Fri, 17 Feb 2012 09:58:57 GMT
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 <erwin.bonhold@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
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message