首先看一个定时任务的配置实例



   
   
       
            com.sinosig.jobmanage.ScanDBQuartzJob
       

       
           
               
           

       

   


   
   
       
           
       

       
            0 * * * * ?
       

   



         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
       
           
               
           

       

   




这份配置中,定义了一个定时任务(ScanDBQuartzJob),一个触发器(ScanDBTrigger),一个调度器(scheduler)。调度器根据触发器的触发周期配置,按时执行定时任务。

如果要在代码中增加定时任务的启动、停止开关,以方便管理员对定时任务进行管理,可以这样做。
1、以调度器为单位进行挂起、启动
首先从spring容器中,根据调度器的id(scheduler)获取一个org.quartz.impl.StdScheduler类的调度器。需要注意的是,虽然spring配置的调度器的类名是org.springframework.scheduling.quartz.SchedulerFactoryBean,但实际获取的类是org.quartz.impl.StdScheduler的。小心类型转换异常。如用这个语句:
StdScheduler factory = (StdScheduler) context.getBean("scheduler");
factory可以提供几种调度器级别上的启动、停止方法。包括:start(),pause(),standby(),shutdown()。
start()方法用来启动调度,这毋庸置疑。pause()和standby()同是暂停,或者叫挂起调度,不过pause()方法已被标记为过期,还是用standby()吧。shutdown()是停止调度,一旦shutdown()了,就不能再用start()方法启动调度了。
以调度器为单位的操作会对该调度器中包含的所有定时任务起作用。如果一个调度器下的多个定时任务要求同启同停,这样处理倒也不错。不过如果需要细化到对每个定时任务进行管理,那就不能这么干了——除非为每个定时任务单独定义一个调度器。

2、以定时任务为单位进行管理
实际上,调度器除了start(),pause(),standby(),shutdown()方法外,还提供了一系列针对定时任务的操作,包括addJob(jobDetail, replace),deleteJob(jobName, groupName),resumeJob(jobName, groupName),pauseJob(jobName, groupName)等。
addJob(jobDetail, replace):向调度器中增加一个定时任务。第二个参数将决定如果调度器中已有这个定时任务,是否要把它替换成新的定义。但是要注意,addJob方法只增加定时任务,不会为它指定触发器。所以,如果只用这个方法来添加定时任务,它是不会被调度的。
,deleteJob(jobName, groupName):从调度器的指定定时任务组中删除指定的定时任务。如果配置文件或代码中都没有指定,那么定时任务们都在默认的定时任务组(StdScheduler.DEFAULT_GROUP)中。这个方法会将与指定定时任务相关联的触发器等一并删除掉。
resumeJob(jobName, groupName):恢复指定定时任务,pauseJob(jobName, groupName):暂停指定定时任务。用这对方法,可以实现针对一条定时任务的暂停、重启管理操作。我就是这么干的。