Quartz实现任务调度
一、任务调度概述
在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作,任务调度涉及多线程并发、线程池维护、运行时间规则解析、运行现场的保护以恢复等方面。Quartz框架是一个开源的企业级任务调度服务,已经被作为任务调度的良好解决方案

二、Quartz框架核心概念
Quartz对任务调度进行了高度抽象,提出了3个核心概念,并在org.quartz包中通过接口和类进行了描述
任务:就是执行的工作内容。Quartz提供Job接口来支持任务定义
触发器:定义触发Job执行的时间触发规则。Quartz提供Trigger类及其子类支持触发器功能,
调度器:Quartz提供了Scheduler接口,将工作任务和触发器绑定,保证任务可以在正确的时间执行
三、Quartz框架的使用流程
案例:
从当前时间开始执行一个特定操作
①:引入jar文件
②:创建entity实体层定义任务的模板
③:定制一个泛型集合用户存储多个Plan对象,提供一个方法读取该泛型集合中的data
④:提醒业务类
⑤:真正的任务对象和触发器对象
步骤一:

步骤二:Plan实体类,并有对应的时间和任务内容
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | publicclassPlan {    //时间    privateString date;        //任务    privateString task;        @Override    publicString toString() {        return"Plan [date="+ date + ", task="+ task + "]";    }        publicPlan() {    }    publicPlan(String date, String task) {        super();        this.date = date;        this.task = task;    } | 
步骤三:定义Service,创建集合,遍历
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | publicclassRemindService {    //创建一个集合,并且方法返回值是一个集合类型    publicList<Plan> getPlans(){        List<Plan> list=newArrayList<Plan>();            Plan p1=newPlan("2016年12月17日","计划一");        Plan p2=newPlan("2016年12月18日","计划二");                list.add(p1);        list.add(p2);        returnlist;            }        //用来打印集合中提醒内容的方法    publicvoidprintMessage(){        List<Plan> list= getPlans();        for(Plan plan : list) {            System.out.println("计划的时间:"+plan.getDate()+"\t"+"计划内容:"+plan.getTask());        }    }} | 
步骤四:创建Quartz层,提醒业务类,实现Job接口,并植入Service对象
 
步骤五:构建Job、Trigger,并绑定Job和Trigger
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |     publicstaticvoidtool() throwsException{          //构建Job         JobDetail job = JobBuilder.newJob(RemindJob.class)                         .withIdentity("job1", "group1").build();                  //构建Trigger        Date runTime = DateBuilder.evenMinuteDate(newDate(System.currentTimeMillis()));        Trigger trigger = TriggerBuilder.newTrigger()                .withIdentity("trigger1", "group1")                .startAt(runTime).build();           //绑定Job和Trigger        //创建调度者工厂        SchedulerFactory sf = newStdSchedulerFactory();        //创建一个调度者        Scheduler sched = sf.getScheduler();       //注册并进行调度        sched.scheduleJob(job,trigger);       //启动调度        sched.start();                /*Thread.sleep(3000);        sched.shutdown();*/    }        publicstaticvoidmain(String[] args) throwsException {    tool();    System.out.println("你猜");}} | 
 
每隔一段时间执行一次操作
 

在特殊时间执行某次操作
使用CronTrigger
CronTrigger也是Trigger的子类
CronTrigger和SimpleTrigger的对比:

CronTrigger允许用户更精准地控制任务的运行日期和时间,而不仅仅是定义工作的频度
CronTrigger通过Cron表达式定义准确的运行时间点。创建CronTrigger的语法如下:
 
四、Cron表达式
要使用CronTrigger,必须掌握Cron表达式
Cron表达式由6~7个由空格分隔的时间元素组成。第7个元素可选
 
Cron表达式有几个特殊的字符,说明如下:

Cron表达式案例:


示例:


 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号