定时任务调度在项目开发中是一种不可缺少的需求,在Java中,实现任务调度有三种方式,分别是jdk自带的任务定时工具Timer、Spring task、第三方组件Quartz,接下来细聊这三种方式。
// 创建定时类
Timer timer = new Timer();
// 创建任务类
TimerTask timerTask = new TimerTask(){
@Override
public void run() {
System.out.println("定时任务启动了"+ LocalDateTime.now());
}
};
// 开启任务
timer.schedule(timerTask,new Date(),2000);
1.须有springboot启动类
2.在启动类上添加注解@EnableScheduling以开启任务调度,编写任务类
@Component
public class text2 {
@Scheduled(cron = "*/1 * * * * *")
public void text2(){
System.out.println("Spring-task开始执行"+ LocalDateTime.now());
}
}
3.通过多任务及睡眠测试结论如下
@Scheduled(cron = "*/1 * * * * *")
public void text1() throws InterruptedException {
System.out.println("Spring-task开始执行1"+ LocalDateTime.now());
Thread.sleep(5000);
}
@Scheduled(cron = "*/1 * * * * *")
public void text2(){
System.out.println("Spring-task开始执行2"+ LocalDateTime.now());
}
结论
1.Spring-task执行任务按照单线程执行,也就是说任务串行执行,任务一未完成任务二不会执行。
2.单线程处理任务能力有限,不建议处理分布式架构任务调度。
引入相关依赖:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-quartzartifactId>
dependency>
建立任务类实现Job接口,实现execute方法
public class test3 implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("Quarts执行了"+ LocalDateTime.now());
}
}
在主方法中创建任务调度器
StdSchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
创建JobDetail实例并与任务类绑定,同时设置任务名称及组名称
JobDetail build = JobBuilder.newJob(test3.class)
.withIdentity("job1","group1")
.build();
创建Trigger实例,设置触发器名称及组名并设置每三秒执行一次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1","group1")
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).repeatForever())
.build();
开启任务调度器
scheduler.scheduleJob(build,trigger);
scheduler.start();
在创建Trigger实例和JobDetail实例时可以添加扩展数据,并在执行任务时,通过该类型参数获取所扩展的数据JobExecutionContext。
//添加
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("param1","value1");
jobDataMap.put("param2","value2");
JobDetail jobDetail = JobBuilder.newJob(MyJob2.class)
.withIdentity("job2","group1")
.setJobData(jobDataMap).build();
//获取
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
System.out.println("任务被执行了,任务参数:"+jobDataMap.get("param1")+","+jobDataMap.get("param2"));
1.在指定时间段内,执行一次任务
2.在指定时间段内,循环执行任务
可以通过表达式来设置时间