QuartZ简易教程

Quartz是一个任务调度框架。比如你遇到这样的问题

• 想每月25号,信用卡自动还款
• 想每年4月1日自己给当年暗恋女神发一封匿名贺卡
• 想每隔1小时,备份一下自己的爱情动作片 学习笔记到云盘

这些问题总结起来就是:在某一个有规律的时间点干某件事。并且时间的触发的条件可以非常复杂(比如每月最后一个工作日的17:50),复杂到需要一个专门的框架来干这个事。 Quartz就是来干这样的事,你给它一个触发条件的定义,它负责到了时间点,触发相应的Job起来干。

第一步:建立一个自定义Job

  1. 实现org.quartz.Job接口;
  2. 重写execute执行方法;
1
2
3
4
5
6
7
public class MyJob implements Job{

@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("这是MyJob,当前时间:"+ new Date().toLocaleString());
}
}

第二步:建立一个QuartZ启动组件

  1. 实现CommandLineRunner接口,随应用启动加载,重写run方法;
  2. 创建Quartz的计划任务;
  3. 开启job;
  4. 配置trigger触发器:
    这是QuartZ在springboot中最简单的实现,
    任务和触发器还可以指定id和分组
  5. 启动Scheduler:
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
@Component
public class QuartzStart implements CommandLineRunner {

public static StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();

@Override
public void run(String... strings) throws Exception {

//创建Quartz的计划任务
Scheduler sched = stdSchedulerFactory.getScheduler();

//开启job
JobDetail job = newJob(MyJob.class).withIdentity("myjob").build();

//配置计划任务的定时器(触发器的作用应给job触发条件,同一个job可以添加多触发条件,不同的job也可以被相同的触发器触发)
Trigger trigger = newTrigger().withIdentity("myjob").withSchedule(cronSchedule("*/30 * * * * ?")).build();

System.out.print(trigger.getKey());

Date date=sched.scheduleJob(job, trigger);//返回首次执行计划任务的时间

sched.start();//开始执行

}

}

第三步:对已建立Scheduler的操作

  1. 获取任务(触发器)及状态;
  2. 暂停任务,暂停触发器;
  3. 重启任务,重启触发器;
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

/**
*通过id获取触发器(getTrigger)
*
*/
@RequestMapping(value = "job")
@ResponseBody
public String job() throws SchedulerException {
StdSchedulerFactory schedulerFactory = QuartzStart.stdSchedulerFactory;
Scheduler scheduler = schedulerFactory.getScheduler();
Trigger trigger = scheduler.getTrigger(TriggerKey.triggerKey("myjob"));

return JSON.toJSONString(trigger.getJobKey());
}


/**
*获取触发器状态(getTriggerState)
*
*/
@RequestMapping(value = "jobStatus")
@ResponseBody
public String jobStatus() throws SchedulerException {
StdSchedulerFactory schedulerFactory = QuartzStart.stdSchedulerFactory;
Scheduler scheduler = schedulerFactory.getScheduler();
return JSON.toJSONString(scheduler.getTriggerState(TriggerKey.triggerKey("myjob")));
}

/**
*暂停触发器(pauseTrigger)
*
*/
@RequestMapping(value = "jobpause")
@ResponseBody
public String jobpause() throws SchedulerException {
StdSchedulerFactory schedulerFactory = QuartzStart.stdSchedulerFactory;
Scheduler scheduler = schedulerFactory.getScheduler();
Trigger trigger = scheduler.getTrigger(TriggerKey.triggerKey("myjob"));

scheduler.pauseTrigger(TriggerKey.triggerKey("myjob"));
return JSON.toJSONString(scheduler.getTriggerState(TriggerKey.triggerKey("myjob")));
}

/**
*重启触发器(resumeTrigger)
*
*/
@RequestMapping(value = "jobreset")
@ResponseBody
public String jobreset() throws SchedulerException {
StdSchedulerFactory schedulerFactory = QuartzStart.stdSchedulerFactory;
Scheduler scheduler = schedulerFactory.getScheduler();
Trigger trigger = scheduler.getTrigger(TriggerKey.triggerKey("myjob"));
scheduler.resumeTrigger(TriggerKey.triggerKey("myjob"));
return JSON.toJSONString(scheduler.getTriggerState(TriggerKey.triggerKey("myjob")));
}

Spring Scheduled(SpringBoot 对定时任务的支持) :

相比QuartZ ,spring scheduled较轻量级,当业务较简单时,推荐用spring scheduled.
@Scheduled注解,可指定固定延迟,或直接用Cron表达式

任务组件

1
2
3
4
5
6
7
8
9

@Component //注解为组件 让spring能扫描到
public class BaseScheduler {

@Scheduled( fixedDelay = 1000*60*5 )//通过@Scheduled(触发规则)
public void jobOne (){
System.out.println("任务一,当前时间"+new Date().toLocaleString() );
}
}

启动类

1
2
3
4
5
6
7
8
9

@EnableScheduling //开启定时任务
@SpringBootApplication
public class DemoApplication {

public static void main ( String[] args ){
SpringApplication.run( DemoApplication.class, args );
}
}

相关链接即下载

  1. 试例源码:
    https://github.com/MroZ11/quartz/
  2. 关于Cron表达式:
    https://www.jianshu.com/p/e9ce1a7e1ed1
  3. 关于Scheduled多线程:
    https://blog.csdn.net/yyx1025988443/article/details/78698046