定时任务框架——Quartz
程序员文章站
2024-03-22 11:58:58
...
Quartz:由Java实现的任务调度框架。可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。
Quartz使用:
1.创建任务调度控制器
Scheduler scheduler= new StdSchedulerFactory().getScheduler();
2.创建任务实现逻辑类Job(只需要实现Job接口execute()为任务实现)
public class JobTask implements Job{
@Override
public void execute(JobExecutionContext arg) throws JobExecutionException {
}
}
- 定义任务描述类JobDetail
JobDetail job = new JobDetail();
job.setName("任务”); //为任务起一个名称
job.setJobClass(new JobTask () );
- 运行任务
定义一个触发器Trigger(SimpleTrigger、CronTrigger、DataIntervalTrigger和NthIncludedTrigger),trigger状态:WAITING,ACQUIRED,EXECUTING,COMPLETE,BLOCKED,ERROR,PAUSED,PAUSED_BLOCKED,DELETED。
规定任务的执行策略(包括名称、开始时间、结束时间、重复执行次数、执行间隔)
Trigger trigger = new SimpleTrigger(config.getName(), null,
startDate.getTime(), null,
SimpleTrigger.REPEAT_INDEFINITELY,
periodTime * 60 * 1000L);
//调用任务执行类执行任务
scheduler.deleteJob(job.getName(), Scheduler.DEFAULT_GROUP);
scheduler.scheduleJob(job, trigger);
Quartz实现原理:
主要组成部分:
scheduler(调度器):将job和trigger绑定在一起
job(任务) :配置具体哪个类实现定时任务
trigger(触发器) :配置定时器参数,如:多久执行一次,执行多上次等
Quartz工作原理
分两类线程:
Scheduler调度线程
任务执行线程
原理
执行常规调度的线程,常规调度线程轮询存储的所有trigger,如果有trigger到达了下一次触发的时间(用wait和notifyAll实现),则从任务执行线程池获取一个空闲线程,执行与该trigger关联的任务。
Scheduler调度线程主要有两个:
执行常规调度的线程
执行misfiredtrigger的线程,Misfire线程是扫描所有的trigger,查看是否有misfiredtrigger,如果有的话根据misfire的策略分别处理(fire now OR wait for the next fire)。