quartz作业调度浅析

我知道quartz作业调度花了5天时间实在说明我有点笨,不过没关系,我已经会了,原理都清楚了,简单的应用都可以轻松搞定。哈哈,等以后要用到Spring框架的时候再回过头来看怎么再配置文件中设置quartz调度,不管在哪里,调度的原理都是一样的,只是展现的形式不同罢了。

动态的配置quartz作业调度:
需要三个类:QuartzTest.java,MySchedulerManage.java,MyJob.java
在一个工程中(不管是web项目还是java Project项目)都需要导入三个包
分别为:quartz-all-1.6.6.jar,commons-collections-3.2.jar,commons-logging-1.1.jar。

创建:

一个job可以绑定一个或者多个trigger,但是一个trigger只能有一个job相对应
1.首先创建一个调度器工厂StdScheduleFactory来获取一个Schedule实例
2.创建一个JobDetail实例,参数为job的name,group以及实现job的类(在下面的例子中这个类就是Myjob)
3.创建一个SimpleTrigger或者CronTrigger,可以不设置参数,因为这两个类的实现了很多getXXX()和setXXX()方法来设置各个属性
4.用调度器实例将job和trigger绑定并注册到Schedule中
5.启动调度器

修改:

方法一:
1.通过trigger的name和group取得在job中已经存在的trigger
2.给这个得到的trigger重新定义触发的表达式
3.调度器重新载入trigger
Sch.reScheduleJob(triggerName,triggerGroup,trigger)
其中Sch为调度器实例
方法二:
1.通过trigger的name和group取得在job中已经存在的trigger
2.通过jobDetail实例的jobName和jobGroup从调度器中删除这个job
3.重新定义trigger触发事件的表达式
4.再把这个trigger和job绑定并且注册到调度器中
Sch.scheduleJob(jobDetail,trigger)
其中Sch为调度器实例

一个job绑定多个trigger:
当一个job已经存在trigger的时候,可以重新创建一个trigger,但是与原先的trigger必需不一样,trigger的name和group其中有一样不同即可。
1.创建一个trigger,在创建的时候指定trigger的name和group以及他所属的job(通过指定job的name和group来唯一指定job)
CronTrigger trigger2 = new CronTrigger("trigger2", "group2",
jobdetail.getName(), jobdetail.getGroup());
2.给trigger设置触发表达式
3.将trigger绑定到相应的job里面
sch.scheduleJob(trigger2);
在这里并不需要指定job,因为trigger在新建的时候已经已经指定了
(注意:并不是sch.scheduleJob(jobdetail, trigger))


下面是我测试的例子

入口类(启动quartz作业调度):QuartzTest

package org.froest;

import java.text.ParseException;
import org.quartz.SchedulerException;

public class QuartzTest {

        /**
         * @param args
         * @throws ParseException 
         * @throws SchedulerException 
         */
        public static void main(String[] args) throws SchedulerException, ParseException {
                MyJob job = new MyJob();
                MySchedulerManage.startUp("LH", job, "0/2 * * * * ?");
        }

}

  quartz作业调度处理类:MySchedulerManage

package org.froest;

import java.text.ParseException;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

public class MySchedulerManage {
        private static SchedulerFactory sf = new StdSchedulerFactory();
        private static String GROUP_NAME = "group1"; 
        private static String TRIGGER_NAME = "trigger1"; 
        
        public static void startUp(String JobName,MyJob job,String time) throws SchedulerException, ParseException{
                Scheduler sch = sf.getScheduler();
                //创建一个JobDetail
                JobDetail jobdetail = new JobDetail(JobName,GROUP_NAME,job.getClass());
                //创建一个Trigger
                CronTrigger trigger = new CronTrigger(TRIGGER_NAME,"group2");
                //把JobDetail和Trigger放入Scheduler中,触发器和作业绑定
                trigger.setCronExpression(time);
                sch.scheduleJob(jobdetail, trigger);
                if(!sch.isShutdown()){
                        sch.start();
                }
        }
        
        public static void modifyJob(JobDetail jobdetail,String time,String time1) 
                throws SchedulerException, ParseException{
                Scheduler sch = sf.getScheduler();
                //必须以trigger的name以及group去获取这个trigger,否则获取不到trigger
                CronTrigger trigger = (CronTrigger)sch.getTrigger(TRIGGER_NAME, "group2");
                /*
                //修改一个job中的trigger以及向job中添加多个trigger的一种写法
                if(null!=trigger){
                        System.out.println("after delete method");
                        trigger.setCronExpression(time);
                        System.out.println("重新调度job");
                        sch.rescheduleJob(trigger.getName(), "group2", trigger);
                }
                CronTrigger trigger2 = new CronTrigger("trigger2", "group2", 
                                jobdetail.getName(), jobdetail.getGroup());
                trigger2.setCronExpression(time1);
                sch.scheduleJob(trigger2);
                */
                //修改一个job中的trigger以及向job中添加多个trigger的另一种写法
                if(null!=trigger){
                        //把job从这个schedule中移除
                        sch.deleteJob(jobdetail.getName(), "group1");
                        trigger.setCronExpression(time);
                        System.out.println("重新调度");
                }
                //把修改后的job重新设置到schedule中
                sch.scheduleJob(jobdetail, trigger);
                CronTrigger trigger2 = new CronTrigger("trigger2", "group2", 
                                jobdetail.getName(), jobdetail.getGroup());
                trigger2.setCronExpression(time1);
                //添加一个新的trigger到schedule中,现在只知道这种方法
                sch.scheduleJob(trigger2);
        }
}

  作业实现类:MyJob(实现job接口)

package org.froest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.SchedulerException;


public class MyJob implements Job {
        private static int i = 0;
        public void execute(JobExecutionContext context) {
                // TODO Auto-generated method stub
                i++;
                SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                System.out.println(f.format(new Date())+"正在执行第"+i+"个Job   executing...");
                //当时间到2011-09-14 15:52:00的时候对job中的trigger进行修改
                if(f.format(new Date()).equals("2011-09-14 15:52:00")){
                        System.out.println(f.format(new Date())+"正在执行另一个Job   executing...");
                        try {
                                MySchedulerManage.modifyJob(context.getJobDetail(),
                                            "0 53 15 * * ?","0 54 15 * * ?");
                        } catch (SchedulerException e) {
                                e.printStackTrace();
                        } catch (ParseException e) {
                                e.printStackTrace();
                        }
                }
        }
}

                                                                                                                                                                  ------->By froest

posted on 2011-09-14 20:56  Kahuna  阅读(8705)  评论(2编辑  收藏  举报

导航