Java的几种任务调度的实现:
- Timer
- ScheduledExecutor 开源工具包
- Quartz 开源工具包
- JCronTab
一般常用的是Java jdk自带的Timer,但是这次只说Quartz。
前言
本demo没有使用注解的方式,而是使用代码api的方式,动态获取闹钟的参数,然后根据算出的cron表达式,创建任务调度。
代码实现
- 引入依赖包
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.3.0</version>
</dependency>
- 新建一个MyJob类,这里是用来实现自己的业务。
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job{
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
/**
* 这里放你的业务实现
*/
System.out.println("任务被调用:" + new Date().getTime()/1000);
}
}
- 新建一个MyTask类,做具体任务调度的实现
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class MyTask {
public static void doTask() throws Exception {
String cron = "0 10 20 * * ?";
// 1、创建调度器Scheduler
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// 2、创建JobDetail实例,并与MyJob类绑定(Job执行内容)
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
.withIdentity("job_name").build();
// // 3.1、构建Trigger实例,每隔1s执行一次
// Date startTime = new Date(new Date().getTime()/1000 + 10);//指定日期开始调度
// Trigger trigger = TriggerBuilder.newTrigger().withIdentity(trigger_name, trigger_group)
.startNow()//立即生效
// .startAt(startTime) // 设置开始时间
// .withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1) //每隔1s执行一次
.repeatForever() //一直执行
// .withRepeatCount(0) //执行的次数,总次数为x + 1
// )
// .build();
// 3.2、构建Trigger实例,每隔1s执行一次
CronTrigger trigger = (CronTrigger)TriggerBuilder.newTrigger()
.withIdentity("trigger_name", "trigger_group")
//设置Cron表达式
.withSchedule(CronScheduleBuilder.cronSchedule(cron))
.build();
//4、执行
scheduler.scheduleJob(jobDetail, trigger);
System.out.println("执行调度");
scheduler.start();
}
}
- 执行结果,看到任务调度是我们预计的结果