参考链接:
https://www.cnblogs.com/vmask/p/8728691.html
https://www.cnblogs.com/qlqwjy/p/8721963.html
添加Maven依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.3.2</version>
</dependency>
版本可以到Maven仓库中使用最新版本的,根据自己心情决定。
创建一个类,实现Job接口,Job接口里面只有一个方法execute(JobExecutionContext xontext)
// 此注解目的为:一定是已经执行完一个任务才按照时间去开启下一个任务
@DisallowConcurrentExecution
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//打印当前的时间
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = new Date();
System.err.println("START:current exec time is :"+sf.format(date));
try {
// 睡眠10秒,测试任务执行时间超过同步周期的情况
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Date date2 = new Date();
System.err.println("-------END:current exec time is :"+sf.format(date2));
}
}
实例化一个JobDetail对象
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("name", "group").build();
有关参数的详细介绍,请自己查找API或者参考上述的参考链接
实例化一个CronTrigger对象,此对象支持Cron表达式
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger", "group1")
.forJob(jobDetail)
.startNow()
.withSchedule(
CronScheduleBuilder.cronSchedule("*/7 * * * * ?") // 这里是cron表达式,意思是:每隔7秒执行一次。
).build();
同理,有关参数的详细介绍,请自己查找API或者参考上述的参考链接
实例化StdSchedulerFactory对象,通过StdSchedulerFactory对象获取一个Scheduler
StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = stdSchedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
- 完整代码为:
public class HelloScheduler {
public static void main(String[] args) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("name", "group").build();
// 打印当前的时间
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = new Date();
System.out.println("current time is :" + sf.format(date));
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger", "group1")
.forJob(jobDetail)
.startNow()
.withSchedule(
CronScheduleBuilder.cronSchedule("*/7 * * * * ?")
).build();
StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = stdSchedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
}
}
这样,启动之后,就会每隔7秒钟执行一次。不过,由于中间睡眠了10秒钟,所以看到的现象是:每隔10秒钟执行一次,而且不会出现并发执行的效果。
@DisallowConcurrentExecution: 此注解的作用是,对于同一个定时任务,只有当上一次执行结束后,才执行下一次。
- 下面是一个关于startNow()方法的说明
quartz trigger builder startnow not firing the trigger during the start:
当使用 Cron 表达式时,StartNow 方法不会起任何效果,Cron 有其自己的执行时间。目前看来 StartNow 应该只适用于 SimpleTrigger 触发器。