最近在做一个值班机器人,每个工作日早上10点在群里提醒对应的人当天是他On Call,类似这样的定时任务可以有很多实现方式,本人选择最经典的Quartz进行实现,由此向大家介绍一下Quartz是什么东西。
Quartz简介
简介: 根据Quartz官网介绍,Quartz是一个开源免费的Apache项目,是一个功能丰富的开源作业调度,可以集成到任何Java应用程序中,从最小的独立应用程序到最大的电子商务系统。Quartz可用于创建简单或复杂的调度,用于执行数百、数千甚至数万个作业;其任务定义为标准的Java组件作业,可以执行任何可编程的任务。Quartz调度程序包含许多企业级特性,例如对JTA事务和集群的支持。
应用场景: 即可以进行任务的定时或者固定频率的执行,例如支付宝的花呗会在每月的固定时期计算你上一个月的花费,从而提醒你这个月的还款,再者就是企业每月固定的工资发放等等应用场景
Quartz三要素
既然知道了Quartz是作业调度用的,那么接下来通过介绍三要素先来了解一下Quartz是如何进行作业调度的。
Quartz包含三个重要的接口(Scheduler、Trigger、Job)
Scheduler(调度器): 可以理解为作业调度框架的Boss,它负责作业的出发,调度,以及执行的协调统一,下面将的Trigger和JobDetail可以注册到Scheduler中。
Trigger(触发器): 作业什么时候触发,什么时候执行是在这里定义的,大致可以分为固定间隔触发和定时触发,分别对应SimpleTrigger和CronTrigger。
JobDetail(作业描述): 可以理解为是Job的包装,一个JobDetail会创建一个Job实例,JobDetail会注册到Scheduler中。
一句话总结:Sechduler负责作业调度,Trigger负责定义触发作业的规则,JobDetail定义Job。
Demo三部曲
Quartz的编码很简单,只需要按照三要素进行三部曲编码即可。
接下来看一下第一个案列,如何实现每个10秒执行一个任务
定义Job
必须实现Job接口,实现execute方法,该方法就是作业的执行逻辑
public class MyJob implements Job {
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("今天值班的同学是瓶子 " + simpleDateFormat.format(date ));
}
}
定义Trigger
为了方便,这里分别定义了两个方法获取SimpleTrigger和CronTrigger,getCronTrigger()中CronScheduleBuilder.cronSchedule("* 1 * * * ? “)的参数” 1 * * * ? *"是cron表达式,这里不展开描述,读者可以自行了解一下
public class MyTrigger {
//创建SimpleTrigger
public static Trigger getSimpleTrigger(){
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInSeconds(2))
.build();
return trigger;
}
//创建CronTrigger
public static Trigger getCronTrigger(){
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("* 1 * * * ? *"))
.build();
return trigger;
}
}
编码Sechduler
public class MySchedulerExecute {
public static void main(String[] agrs) throws Exception{
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
//调度器
Scheduler scheduler = schedulerFactory.getScheduler();
//触发器
Trigger trigger = MyTrigger.getSimpleTrigger();
//Trigger trigger = MyTrigger.getCronTrigger();
/*
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInSeconds(2))
.build();*/
//任务
JobDetail jobDetail = JobBuilder.newJob(MyJob.class).build();
//将trigger和jobdetail进行关联
scheduler.scheduleJob(jobDetail, trigger);
//开启scheduler
scheduler.start();
}
}
Quartz还有很多优秀的特性值得我们去学习,很多新的作业调度框架底层都是经典的Quartz。以上只是简单的对Quartz的入门了解和应用,如有错误请批评指教!