quartz是一个定时任务框架,采用Java开发,借助这个框架,可以让程序周期性的执行某个人物,他支持多种形式的时间制定,即执行的时间周期。Java中原生的Timer也有定时任务的功能,但是Quartz更加强大,管理也更加方便,多数开源框架也使用到了这个定时框架。
下面我们来快速入门一下这个好用的框架。
概念学习
- 任务
- 触发器
- 调度器
任务Job和JobDetail
定时任务调度,你总得有任务吧,所以就有这么一个接口Job,
这个重写的方法,就是我们想要被调度的任务了。
那JobDetail是什么呢?他绑定了一个Job.class,通过JobDetail可以获取到一些Job的信息,后续我们可以看到如何使用。
触发器Trigger
什么是触发器?就是什么时候去执行一个任务,在这里可以指定调用的时间。包括包括SimpleTrigger和CronTrigger,两种形式的时间指定触发器。
调度器
那么有了任务和触发器,如何让触发器知道调用哪个任务,就需要调度来进行协调。
总结
概念还是比较清晰的,但是上手使用可能还有点懵逼,接下来我们就具体来看看如何使用。
Quartz使用
- 导入依赖
<!-- 定时任务 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
- 实现任务
public class PrintJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("我是定时任务:"+this);
}
}
注意:JobExecutionContext类是quartz的上下文环境,可以获取相应的内容。
public interface JobExecutionContext {
Scheduler getScheduler();
Trigger getTrigger();
Calendar getCalendar();
boolean isRecovering();
TriggerKey getRecoveringTriggerKey() throws IllegalStateException;
...具体的可以点进去查看
}
- 设置触发器 SimpleTrigger
// 这是具体的触发器,多久触发一次
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
.startNow()//立即生效
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1)//每隔1s执行一次
.repeatForever()).build();//一直执行
CronTrigger
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
.usingJobData("trigger1", "这是jobDetail1的trigger")
.startNow()//立即生效
.startAt(startDate)
.endAt(endDate)
.withSchedule(CronScheduleBuilder.cronSchedule("* 30 10 ? * 1/5 2022"))
.build();
SimpleTrigger使用较为简单一些,而CronTrigger难一些,因为cron表达式比较难搞,如果学过linux的,应该对这个不陌生。
cron表达式格式:[秒] [分] [小时] [日] [月] [周] [年] 上面的例子是2022年的每周一到周五的上午十点半执行一次。
4.结合调度器 这个比较简单,可以直接看最终代码
StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
//这是具体的任务
JobDetail jobDetail = JobBuilder.newJob(PrintJob.class).
//设置名称和group组
withIdentity("name1", "group1").build();
// 这是具体的触发器,多久触发一次
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger-name", "triggerGroup1")
.startNow()//立即生效
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1)//时间间隔为1秒
//重复执行
.repeatForever()).build();
//将触发器和任务结合起来,让触发器知道到点了该调度哪个任务
scheduler.scheduleJob(jobDetail,trigger);
System.out.println("start");
scheduler.start();
//十秒后将定时任务停止
Thread.sleep(10000);
scheduler.shutdown();
System.out.println("end");