文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot实战:SpringBoot三种定时任务实现方式

2024-11-29 18:43

关注

1. 基于注解的方式(@Scheduled)

使用@Scheduled注解是实现Spring Boot定时任务最简单直接的方式。首先,你需要在Spring Boot的启动类或者配置类上添加@EnableScheduling注解来启用定时任务支持。然后,在需要定时执行的方法上添加@Scheduled注解,并指定cron表达式或固定间隔。

例子代码:

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
@EnableScheduling
public class ScheduledTasks {

    @Scheduled(cron = "0/5 * * * * *") // 每5秒执行一次
    public void runEveryFiveSeconds() {
        System.out.println("任务执行: " + System.currentTimeMillis());
    }

    @Scheduled(fixedRate = 5000) // 每5秒执行一次,与上一个任务不同,fixedRate是基于上一次开始时间计算
    public void runFixedRateTask() {
        System.out.println("固定频率任务执行: " + System.currentTimeMillis());
    }
}

在上面的代码中,@Scheduled注解分别使用了cron表达式和固定频率(fixedRate)两种方式来定义定时任务。需要注意的是,@EnableScheduling注解只需要在Spring Boot的启动类或配置类上添加一次。

2. 基于接口的方式(SchedulingConfigurer)

如果你需要更灵活地控制定时任务,比如从数据库中读取任务的执行周期,那么可以使用SchedulingConfigurer接口。通过实现这个接口,你可以自定义任务的注册逻辑,包括任务的执行周期等。

例子代码:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;

@Configuration
@EnableScheduling
public class DynamicScheduleTask implements SchedulingConfigurer {

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        scheduler.setThreadNamePrefix("taskScheduler-");
        return scheduler;
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(
                () -> System.out.println("动态定时任务执行: " + System.currentTimeMillis()),
                context -> {
                    // 这里可以从数据库读取cron表达式
                    String cron = "0/10 * * * * *"; // 示例cron表达式,每10秒执行一次
                    CronTrigger trigger = new CronTrigger(cron);
                    return trigger.nextExecutionTime(context);
                }
        );
    }
}

在上面的代码中,通过实现SchedulingConfigurer接口,我们自定义了任务的注册逻辑,包括从外部数据源(例如数据库)读取cron表达式,并据此设置任务的执行周期。

3. 使用Quartz调度器

Quartz是一个功能强大的开源作业调度库,它提供了比Spring的@Scheduled注解更为复杂的调度选项,如作业持久化、集群支持和事务性作业。在Spring Boot中集成Quartz,你需要添加Quartz的依赖,并配置JobDetail、Trigger和Scheduler bean。

例子配置

首先,在pom.xml中添加Quartz依赖:


    org.springframework.boot
    spring-boot-starter-quartz

然后,定义作业类、配置Quartz调度器,并通过Java配置或XML配置来注册JobDetail和Trigger。

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class MyQuartzJob extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Quartz任务执行: " + System.currentTimeMillis());
    }
}

配置类省略,因为Quartz的详细配置相对复杂,包括JobDetail、Trigger和Scheduler bean的定义,通常需要根据具体需求来配置。不过,Spring Boot的spring-boot-starter-quartz已经为我们做了很多简化工作,包括自动配置Scheduler等。

总结

在Spring Boot中实现定时任务有多种方式,包括基于注解的方式、基于接口的方式以及使用外部任务调度工具如Quartz等。选择哪种方式取决于你的具体需求,比如任务的复杂度、是否需要动态调整任务执行周期等。在实际项目中,可以根据项目特点和个人偏好选择最适合的实现方式。

来源:后端Q内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯