[jboss-cvs] jboss-seam/src/main/org/jboss/seam/core ...

Michael Yuan michael.yuan at jboss.com
Mon Jun 4 18:46:26 EDT 2007


  User: myuan   
  Date: 07/06/04 18:46:26

  Added:       src/main/org/jboss/seam/core  QuartzDispatcher.java
  Log:
  Add initial support for quartz
  
  Revision  Changes    Path
  1.1      date: 2007/06/04 22:46:26;  author: myuan;  state: Exp;jboss-seam/src/main/org/jboss/seam/core/QuartzDispatcher.java
  
  Index: QuartzDispatcher.java
  ===================================================================
  package org.jboss.seam.core;
  
  import static org.jboss.seam.annotations.Install.BUILT_IN;
  
  import java.util.Date;
  import java.rmi.server.UID;
  import java.io.Serializable;
  
  import javax.interceptor.Interceptors;
  
  import org.quartz.SchedulerFactory;
  import org.quartz.Scheduler;
  import org.quartz.Job;
  import org.quartz.JobDetail;
  import org.quartz.JobDataMap;
  import org.quartz.Trigger;
  import org.quartz.SimpleTrigger;
  import org.quartz.JobExecutionContext;
  import org.quartz.JobExecutionException;
  import org.quartz.SchedulerException;
  
  import org.jboss.seam.log.LogProvider;
  import org.jboss.seam.log.Logging;
  import org.jboss.seam.Component;
  import org.jboss.seam.ScopeType;
  import org.jboss.seam.annotations.Create;
  import org.jboss.seam.annotations.Destroy;
  import org.jboss.seam.annotations.Install;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Scope;
  import org.jboss.seam.ejb.SeamInterceptor;
  import org.jboss.seam.intercept.InvocationContext;
  
  /**
   * Dispatcher implementation that uses the Quartz library.
   * 
   * @author Michael Yuan
   *
   */
  @Scope(ScopeType.APPLICATION)
  @Name("org.jboss.seam.core.dispatcher")
  @Interceptors(SeamInterceptor.class)
  @Install(value=false, precedence=BUILT_IN)
  public class QuartzDispatcher extends AbstractDispatcher<QuartzDispatcher.QuartzTriggerHandle, TimerSchedule>
  {
     
     private static final LogProvider log = Logging.getLogProvider(QuartzDispatcher.class);
     private static Scheduler scheduler;
  
     @Create
     public void initScheduler () 
     {
       SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
       try {
         scheduler = schedulerFactory.getScheduler();
         scheduler.start();
         log.info("The QuartzDispatcher has started");
       } catch (SchedulerException se) {
         log.error("Cannot get or start a Quartz Scheduler");
         se.printStackTrace ();
       }
     }
  
     public QuartzTriggerHandle scheduleAsynchronousEvent(String type, Object... parameters)
     {  
        String jobName = nextUniqueName();
        String triggerName = nextUniqueName();
        
        JobDetail jobDetail = new JobDetail(jobName, null, QuartzJob.class);
        jobDetail.getJobDataMap().put("async", new AsynchronousEvent(type, parameters));
         
        SimpleTrigger trigger = new SimpleTrigger (triggerName, null);
        
        log.info("In the scheduleAsynchronousEvent()");
  
        try {
          scheduler.scheduleJob( jobDetail, trigger );
          return new QuartzTriggerHandle(triggerName);
        } catch (SchedulerException se) {
          log.error("Cannot Schedule a Quartz Job");
          se.printStackTrace ();
          return null;
        }
     }
      
     public QuartzTriggerHandle scheduleTimedEvent(String type, TimerSchedule schedule, Object... parameters)
     {
        log.info("In the scheduleTimedEvent()");
        try {
          return scheduleWithQuartzService( schedule, new AsynchronousEvent(type, parameters) );
        } catch (SchedulerException se) {
          log.error("Cannot Schedule a Quartz Job");
          se.printStackTrace ();
          return null;
        }
     }
     
     public QuartzTriggerHandle scheduleInvocation(InvocationContext invocation, Component component)
     {
        log.info("In the scheduleInvocation()");
        try {
          return scheduleWithQuartzService( 
                 createSchedule(invocation), 
                 new AsynchronousInvocation(invocation, component)
              );
        } catch (SchedulerException se) {
          log.error("Cannot Schedule a Quartz Job");
          se.printStackTrace ();
          return null;
        }
     }
        
     private static Date calculateDelayedDate (long delay)
     {
       Date now = new Date ();
       now.setTime(now.getTime() + delay);
       return now;
     }
  
     private QuartzTriggerHandle scheduleWithQuartzService(TimerSchedule schedule, Asynchronous async) throws SchedulerException
     {
        log.info("In the scheduleWithQuartzService()");
        
        String jobName = nextUniqueName();
        String triggerName = nextUniqueName();
        
        JobDetail jobDetail = new JobDetail(jobName, null, QuartzJob.class);
        jobDetail.getJobDataMap().put("async", async);
  
        if ( schedule.getIntervalDuration()!=null )
        {
           if ( schedule.getExpiration()!=null )
           {
              SimpleTrigger trigger = new SimpleTrigger (triggerName, null, schedule.getExpiration(), null, SimpleTrigger.REPEAT_INDEFINITELY, schedule.getIntervalDuration());
              scheduler.scheduleJob( jobDetail, trigger );
  
              // return executor.scheduleAtFixedRate( runnable, toDuration( schedule.getExpiration() ), schedule.getIntervalDuration(), TimeUnit.MILLISECONDS );
           }
           else if ( schedule.getDuration()!=null )
           {
               SimpleTrigger trigger = new SimpleTrigger (triggerName, null, calculateDelayedDate(schedule.getDuration()), null, SimpleTrigger.REPEAT_INDEFINITELY, schedule.getIntervalDuration());
               scheduler.scheduleJob( jobDetail, trigger );
  
               // return executor.scheduleAtFixedRate( runnable, schedule.getDuration(), schedule.getIntervalDuration(), TimeUnit.MILLISECONDS );
           }
           else
           {
              SimpleTrigger trigger = new SimpleTrigger (triggerName, null, SimpleTrigger.REPEAT_INDEFINITELY, schedule.getIntervalDuration());
              scheduler.scheduleJob( jobDetail, trigger );
  
              // return executor.scheduleAtFixedRate( runnable, 0l, schedule.getIntervalDuration(), TimeUnit.MILLISECONDS );
           }
        }
        else if ( schedule.getExpiration()!=null )
        {
            SimpleTrigger trigger = new SimpleTrigger (triggerName, null, schedule.getExpiration());
            scheduler.scheduleJob( jobDetail, trigger );
  
            // return executor.schedule( runnable, toDuration( schedule.getExpiration() ), TimeUnit.MILLISECONDS );
        }
        else if ( schedule.getDuration()!=null )
        { 
            SimpleTrigger trigger = new SimpleTrigger (triggerName, null, calculateDelayedDate(schedule.getDuration()));
            scheduler.scheduleJob( jobDetail, trigger );
  
            // return executor.schedule( runnable, schedule.getDuration(), TimeUnit.MILLISECONDS );
        }
        else
        {
           SimpleTrigger trigger = new SimpleTrigger (triggerName, null);
           scheduler.scheduleJob( jobDetail, trigger );
  
           // return executor.schedule(runnable, 0l, TimeUnit.MILLISECONDS);
        }
        return new QuartzTriggerHandle (triggerName);
     }
     
     private String nextUniqueName ()
     {
        return (new UID()).toString();
     }
     
     @Destroy
     public void destroy()
     {
        log.info("The QuartzDispatcher is shut down");
        try {
          scheduler.shutdown();
        } catch (SchedulerException se) {
          log.error("Cannot shutdown the Quartz Scheduler");
          se.printStackTrace ();
        }
        
     }
     
     public static class QuartzJob implements Job
     {
        private AbstractDispatcher.Asynchronous async;
        
        public QuartzJob() { }
  
        public void execute(JobExecutionContext context)
            throws JobExecutionException
        {
           log.info("Start executing Quartz job");
           JobDataMap dataMap = context.getJobDetail().getJobDataMap();
           async = (AbstractDispatcher.Asynchronous)dataMap.get("async");
           async.execute(null);
           log.info("End executing Quartz job");
        }
     }
     
     public static class QuartzTriggerHandle implements Serializable
     {
        private String triggerName;
          
        public QuartzTriggerHandle(String triggerName) 
        {
           this.triggerName = triggerName; 
        }
  
        public void cancel () throws SchedulerException
        {
           log.info("Cancel executing Quartz job");
           scheduler.unscheduleJob(triggerName, null);
        }
        
        public void pause () throws SchedulerException
        {
           log.info("Pause executing Quartz job");
           scheduler.pauseTrigger (triggerName, null);
           
        }
        
        public void resume () throws SchedulerException
        {
           log.info("Resume executing Quartz job");
           scheduler.resumeTrigger (triggerName, null);
        }
     }
  
  }
  
  
  



More information about the jboss-cvs-commits mailing list