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 10:06:24 GMT
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 <gerhard.petracek@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 <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