在 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 中实现定时任务的几种常见技术,你可以根据具体需求选择合适的方式。