
SpringBoot定时任务是Java开发经常使用的功能,下面我就来详解3种常见的SpringBoot定时任务@mikechen
SpringBoot 注解实现定时任务
使用 @Scheduled 注解可以在方法上标注定时任务的执行逻辑,这种方式比较简单,适合执行简单的定时任务。
如下所示:
@Scheduled 注解支持多种定时方式,如 fixedRate、cron、fixedDelay 等方式。
1.fixedRate方式
fixedRate表示:控制方法执行的间隔时间,比如间隔1秒执行一次。
如下所示:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class MyScheduledTask {
@Scheduled(fixedRate = 1000)
public void myTask() {
System.out.println("定时任务执行");
}
}
上述代码使用 @Scheduled 注解标注了一个名为 myTask 的定时任务,该定时任务每隔 1 秒钟执行一次,打印一条消息。
2.cron表达式方式
Cron表达式是一个字符串,包含六个或七个由空格分隔的时间字段,分别表示:秒、分、小时、日、月、周、年(可选)。
Cron表达式可以用于定制化实现定时任务,比如:
// 每天凌晨1点执行一次
@Scheduled(cron = "0 0 1 * * ?")
public void myTask2() {
System.out.println("定时任务执行");
}
该cron表达式表示:每天凌晨1点执行一次。
以下是常用的Cron表达式参数:
- 秒(0-59)
- 分钟(0-59)
- 小时(0-23)
- 日(1-31)
- 月(1-12 或 JAN-DEC)
- 周几(1-7 或 SUN-SAT)
- 年(可选,1970-2099)
3.initialDelay方式
initialDelay 表示在容器启动后,延迟再执行一次定时器。
如下所示:
@Component
@EnableScheduling //开启定时任务
public class ScheduleTask {
//容器启动后,延迟10秒后再执行一次定时器
@Scheduled(initialDelay = 10000)
private void myTasks3() {
System.out.println("我是一个定时任务3");
}
}
容器启动后,延迟10秒后再执行一次定时器。
SpringBoot接口实现定时任务
实现 ScheduledConfigurer 接口可以更灵活地配置定时任务,该接口只有一个方法 configureTasks,它可以通过 TaskRegistrar 参数来添加定时任务。
具体用法如下:
@Configuration
@EnableScheduling
public class MyScheduledTasks implements ScheduledConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(
() -> {
// 定时任务逻辑
},
triggerContext -> {
CronTrigger cronTrigger = new CronTrigger("0 0 0 * * ?");
return cronTrigger.nextExecutionTime(triggerContext);
}
);
}
}
上面的代码中,使用 configureTasks 方法添加了一个定时任务,使用了 CronTrigger 触发器,每天凌晨 0 点执行一次。
SpringBoot Quartz实现定时任务
Quartz 是一个功能强大的调度框架,Spring Boot 集成了 Quartz,可以使用 Quartz 来实现定时任务。
这种方式比较灵活,但需要学习 Quartz 的相关知识,使用稍微复杂一些。
如下所示:
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class MyScheduledTask {
public void start() throws SchedulerException {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("myJob", "group1")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1))
.startNow()
.build();
scheduler.scheduleJob(job, trigger);
scheduler.start();
}
public void stop() throws SchedulerException {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.shutdown();
}
public static class MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("定时任务执行");
}
}
}
上述代码定义了一个名为 MyScheduledTask 的类,并使用 Quartz 框架来实现定时任务。
该定时任务每隔 1 秒钟执行一次,打印一条消息。
其中,定时任务的具体逻辑由 MyJob 类中的 execute 方法实现。
以上就是SpringBoot定时任务详解,更多内容请查看:SpringBoot框架(万字图文全面详解)
mikechen睿哥
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。