定时任务的实现方式有多种。早期没有定时任务框架的时候,我们会使用JDK中的Timer机制和多线程机制(Runnable+线程休眠)来实现定时或者间隔⼀段时间执行某⼀段程序。后来有了定时任务框架,比如大名鼎鼎的Quartz任务调度框架,使用时间表达式(包括:秒、分、时、⽇、周、年)配置某⼀个任务什么时间去执行。
当下对于分布式的任务调度有很多解决方案,比较热门的就是Elastic-Job和XXL-JOB。以上两个产品也是基于Quartz框架做的。我们本篇文章主要讲解一下Quartz框架的简单使用,为自己封装自己的定时任务工具做一个敲门砖。
首先引入依赖:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
开发一个任务调度器生产的方法:
// 创建作业任务调度器(类似于公交调度站)
public static Scheduler createScheduler() throws SchedulerException {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
return scheduler;
}
开发一个定时触发器:
/**
* 创建作业任务时间触发器(类似于公交车出⻋时间表)
* cron表达式由七个位置组成,空格分隔
* 1、Seconds(秒) 0~59
* 2、Minutes(分) 0~59
* 3、Hours(⼩时) 0~23
* 4、Day of Month(天)1~31,注意有的月份不足31天
* 5、Month(月) 0~11,或者 JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC
* 6、Day of Week(周) 1~7,1=SUN或者 SUN,MON,TUE,WEB,THU,FRI,SAT
* 7、Year(年)1970~2099 可选项
* 示例:
* 0 0 11 * * ? 每天的11点触发执行⼀次
* 0 30 10 1 * ? 每⽉1号上午10点半触发执行⼀次
*/
public static Trigger createTrigger() {
// 创建时间触发器,按日历调度
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("triggerName", "myTrigger")
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ? "))
.build();
// 创建触发器,按简单间隔调度
// SimpleTrigger trigger1 = TriggerBuilder.newTrigger()
// .withIdentity("triggerName", "myTrigger")
// .startNow()
// .withSchedule(SimpleScheduleBuilder
// .simpleSchedule()
// .withIntervalInSeconds(3)
// .repeatForever())
// .build();
return trigger;
}
我们开发一个自定义的Job,实现自定义的定时业务逻辑:
public class DemoJob implements Job {
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("我是⼀个定时任务逻辑");
}
}
接下来,开发我们的一个作业任务:
// 创建⼀个作业任务(类似于⼀辆公交车)
public static JobDetail createJob() {
JobBuilder jobBuilder = JobBuilder.newJob(DemoJob.class);
jobBuilder.withIdentity("jobName", "myJob");
JobDetail jobDetail = jobBuilder.build();
return jobDetail;
}
最后,创建一个测试方法来测试我们上述代码:
// 定时任务作业主调度程序
public static void main(String[] args) throws SchedulerException {
// 创建⼀个作业任务调度器(类似于公交调度站)
Scheduler scheduler = QuartzMain.createScheduler();
// 创建⼀个作业任务(类似于⼀辆公交车)
JobDetail job = QuartzMain.createJob();
// 创建⼀个作业任务时间触发器(类似于公交车出车时间表)
Trigger trigger = QuartzMain.createTrigger();
// 使⽤调度器按照时间触发器执行这个作业任务
scheduler.scheduleJob(job, trigger);
scheduler.start();
}
执行结果如下:

文章评论
加油
@yalong hiahia