4 Replies Latest reply on Oct 15, 2008 9:02 AM by Markus Heidt

    QuartzDispatcher and ClassNotFoundException

    Markus Heidt Newbie

      I have an issue with QuartzDispatcher and scheduleTimedEvent.


      This is the error message:


      21:16:01,118 ERROR [ErrorLogger] Job (DEFAULT.-6ad11a7d:1185c88089f:-7f8e threw an exception.
      org.quartz.SchedulerException: Job threw an unhandled exception. 
      [See nested exception: org.jboss.seam.InstantiationException: 
      Could not instantiate Seam component: danteUsersRetriever]
      at org.quartz.core.JobRunShell.run(JobRunShell.java:214)
      ...
      Caused by: javax.naming.CommunicationException 
      [Root 
      exception is java.lang.ClassNotFoundException: 
      No ClassLoaders found for: org.domain.QuartzTest.session.DanteUsersRetriever 
      (no security manager: RMI class loader disabled)]




      It's reproducible very easily:



      • AS 4.2.1, Seam 2.0.1.GA

      • Create new seam project

      • change components.xml:





      <components
      ...
       xmlns:async="http://jboss.com/products/seam/async"
      ...
       xsi:schemaLocation=
         "...http://jboss.com/products/seam/async http://jboss.com/products/seam/async-2.0.xsd...
      >
      <async:quartz-dispatcher/>







      • Add two classes




      DanteUsersTimer.java



      package org.domain.QuartzTest.session;
      import org.jboss.annotation.ejb.Local;
      
      @Local
      public interface DanteUsersTimer {
           public void start() throws Exception;
           public void cancel();
           public void stop();
      }






      DanteUsersTimerBean.java


      package org.domain.QuartzTest.session;
      
      import org.jboss.seam.ScopeType;
      import org.jboss.seam.annotations.Destroy;
      import org.jboss.seam.annotations.Logger;
      import org.jboss.seam.annotations.Name;
      import org.jboss.seam.annotations.Observer;
      import org.jboss.seam.annotations.Scope;
      import org.jboss.seam.annotations.Startup;
      import org.jboss.seam.async.CronSchedule;
      import org.jboss.seam.async.QuartzDispatcher;
      import org.jboss.seam.async.QuartzTriggerHandle;
      import org.jboss.seam.log.Log;
      
      @Name("danteUsersTimer")
      @Scope(ScopeType.APPLICATION)
      @Startup
      public class DanteUsersTimerBean implements DanteUsersTimer {
      private static final String defaultTrigger = "1 * * * * ?"; //every minute
      
      @Logger private Log log;
      
      private QuartzTriggerHandle handle;
      
      private String trigger = defaultTrigger;
      
      @Observer("org.jboss.seam.postInitialization")
      public void start() throws Exception{
      setTrigger(defaultTrigger);
      }
      
      public void restoreDefault(){
      setTrigger(defaultTrigger);
      }
      
      public void setTrigger(String trigger){
      try{
      QuartzTriggerHandle handle = QuartzDispatcher.instance().scheduleTimedEvent("retrieveDanteUsers",
      new CronSchedule((Long) null, trigger));
      
      if (this.handle != null)
                 this.handle.cancel();
      
      this.handle = handle;
      this.trigger = trigger;
      }
      catch (Exception e){
      log.error("setTrigger(): #0", e, trigger);
      }
      }
      
      public String getTrigger(){
      return trigger;
      }
      
      public void cancel(){
      try{
      if (handle != null)
                 handle.cancel();
      handle = null;
      trigger = null;
      }
      catch (Exception e){
      log.error("cancel(): #0", e, trigger);
      }
      }
      
      @Destroy
      public void stop(){
      cancel();
      }
      }




      DanteUsersRetriever.java


      package com.dai.dante_tscm.session.users;
      
      import org.jboss.annotation.ejb.Local;
      
      
      @Local
      public interface DanteUsersRetriever {
           public void retrieve();
      }
      



      DanteUsersRetrieverBean.java



      package com.dai.dante_tscm.session.users;
      
      import javax.ejb.Stateless;
      
      import org.jboss.seam.annotations.Logger;
      import org.jboss.seam.annotations.Name;
      import org.jboss.seam.annotations.Observer;
      import org.jboss.seam.log.Log;
      
      @Name("danteUsersRetriever")
      @Stateless
      public class DanteUsersRetrieverBean implements DanteUsersRetriever{
           @Logger private Log log;
           
           @Observer("retrieveDanteUsers")
           public void retrieve() {
                log.info("retrieve dante users");
                
           }
      
      }