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
public  class  Plan {
     //时间
     private  String date;
     
     //任务
     private  String task;
     
     @Override
     public  String toString() {
         return  "Plan [date="  + date +  ", task="  + task +  "]" ;
     }
 
     
     public  Plan() {
     }
 
     public  Plan(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
public  class  RemindService {
 
     //创建一个集合,并且方法返回值是一个集合类型
     public  List<Plan> getPlans(){
         List<Plan> list= new  ArrayList<Plan>();
     
         Plan p1= new  Plan( "2016年12月17日" , "计划一" );
         Plan p2= new  Plan( "2016年12月18日" , "计划二" );
         
         list.add(p1);
         list.add(p2);
         return  list;
         
     }
     
     //用来打印集合中提醒内容的方法
     public  void  printMessage(){
         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
     public  static  void  tool()  throws  Exception{
           //构建Job
          JobDetail job = JobBuilder.newJob(RemindJob. class )
                          .withIdentity( "job1" "group1" ).build();
          
          //构建Trigger
         Date runTime = DateBuilder.evenMinuteDate( new  Date(System.currentTimeMillis()));
         Trigger trigger = TriggerBuilder.newTrigger()
                 .withIdentity( "trigger1" "group1" )
                 .startAt(runTime).build();
    
         //绑定Job和Trigger
         //创建调度者工厂
         SchedulerFactory sf =  new  StdSchedulerFactory();
         //创建一个调度者
         Scheduler sched = sf.getScheduler();
        //注册并进行调度
         sched.scheduleJob(job,trigger);
        //启动调度
         sched.start();
         
         /*Thread.sleep(3000);
         sched.shutdown();*/
     }
     
     
public  static  void  main(String[] args)  throws  Exception {
     tool();
     System.out.println( "你猜" );
}
}

 


每隔一段时间执行一次操作

 


在特殊时间执行某次操作

 使用CronTrigger

CronTrigger也是Trigger的子类

CronTriggerSimpleTrigger的对比:

CronTrigger允许用户更精准地控制任务的运行日期和时间,而不仅仅是定义工作的频度

CronTrigger通过Cron表达式定义准确的运行时间点。创建CronTrigger的语法如下:

 


四、Cron表达式

 要使用CronTrigger,必须掌握Cron表达式

 Cron表达式由6~7个由空格分隔的时间元素组成。第7个元素可选 

 

Cron表达式有几个特殊的字符,说明如下:

Cron表达式案例:

示例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值