SpringBoot定时任务详解(3种常见定时任务)

SpringBoot定时任务详解(3种常见定时任务)-mikechen

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年+大厂架构经验,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法