在 Spring 里,实现定时任务有多种技术手段,下面为你详细介绍常见的几种实现方式。
1. 使用 @Scheduled
注解
@Scheduled
是 Spring 框架提供的一个注解,能让你轻松地在方法上设置定时任务。使用这种方式需要在配置类上添加 @EnableScheduling
注解来开启定时任务的支持。
示例代码
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
// 开启定时任务支持
@EnableScheduling
@Component
public class ScheduledTasks {
// 固定延迟,上一次任务执行完成后,延迟 5000 毫秒再执行下一次任务
@Scheduled(fixedDelay = 5000)
public void fixedDelayTask() {
System.out.println("Fixed delay task executed at: " + System.currentTimeMillis());
}
// 固定速率,每隔 3000 毫秒执行一次任务
@Scheduled(fixedRate = 3000)
public void fixedRateTask() {
System.out.println("Fixed rate task executed at: " + System.currentTimeMillis());
}
// 使用 cron 表达式,每天凌晨 2 点执行任务
@Scheduled(cron = "0 0 2 * * ?")
public void cronTask() {
System.out.println("Cron task executed at: " + System.currentTimeMillis());
}
}
代码解释
@EnableScheduling
:在配置类上添加该注解,用于开启 Spring 的定时任务功能。@Scheduled
:用于标记需要定时执行的方法。fixedDelay
:表示上一次任务执行完成后,延迟指定的毫秒数再执行下一次任务。fixedRate
:表示每隔指定的毫秒数执行一次任务,不管上一次任务是否执行完成。cron
:使用 cron 表达式来指定任务的执行时间。
2. 使用 SchedulingConfigurer
接口
如果你需要更灵活地配置定时任务,可以实现 SchedulingConfigurer
接口。
示例代码
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
// 配置类,开启定时任务支持并实现 SchedulingConfigurer 接口
@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
taskRegistrar.addFixedRateTask(() -> {
System.out.println("Custom scheduled task executed at: " + System.currentTimeMillis());
}, 5000);
}
// 创建一个线程池执行器
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(5);
}
}
代码解释
SchedulingConfigurer
:通过实现该接口的configureTasks
方法,可以自定义定时任务的配置。taskRegistrar.setScheduler
:设置任务执行器。taskRegistrar.addFixedRateTask
:添加一个固定速率的定时任务。
3. 使用 Quartz 框架
Quartz 是一个功能强大的开源任务调度框架,Spring 对 Quartz 提供了很好的集成支持。
添加依赖
如果你使用的是 Maven 项目,需要在 pom.xml
中添加 Quartz 和 Spring 集成的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
</dependencies>
示例代码
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
// 定义一个 Quartz 任务类
public class QuartzJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Quartz job executed at: " + System.currentTimeMillis());
}
}
// 配置类,配置 Quartz 任务和触发器
@Configuration
public class QuartzConfig {
@Bean
public JobDetailFactoryBean jobDetail() {
JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
jobDetailFactory.setJobClass(QuartzJob.class);
jobDetailFactory.setDurability(true);
return jobDetailFactory;
}
@Bean
public CronTriggerFactoryBean cronTrigger(JobDetailFactoryBean jobDetail) {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(jobDetail.getObject());
trigger.setCronExpression("0/5 * * * * ?"); // 每 5 秒执行一次
return trigger;
}
@Bean
public SchedulerFactoryBean schedulerFactory(CronTriggerFactoryBean cronTrigger) {
SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
schedulerFactory.setTriggers(cronTrigger.getObject());
return schedulerFactory;
}
}
代码解释
QuartzJob
:实现Job
接口,定义具体的任务逻辑。JobDetailFactoryBean
:用于创建JobDetail
对象,指定要执行的任务类。CronTriggerFactoryBean
:用于创建CronTrigger
对象,指定任务的执行时间。SchedulerFactoryBean
:用于创建Scheduler
对象,启动任务调度。
以上就是在 Spring 中实现定时任务的几种常见技术,你可以根据具体需求选择合适的方式。