SpringBoot——Scheduled定时任务

这篇具有很好参考价值的文章主要介绍了SpringBoot——Scheduled定时任务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.静态定时任务

2.动态定时任务


在一些业务场景中,我们需要定义一些任务在我们指定的时间或是每隔一个时间段就自动执行,来作为任务的前提,保证业务的执行。比如:我们需要一个定时任务,每天早上6点执行,对数据库中的某个日期字段进行修改,修改为当天时间。

1.静态定时任务

springboot中为我们提供了自带的定时任务。

首先,我们需要让项目能使用定时任务:

@EnableScheduling
@SpringBootApplication
public class CourtSeckillMain {
    public static void main(String[] args) {
        SpringApplication.run(CourtSeckillMain.class,args);
    }
}

然后,我们需要在业务类中编写代码:

    @Override
    @Scheduled(cron = "0 0 6 * * ?")
    //秒 分 时 日 月 周 年(可选);*表所有可能的值,-指定范围值,/表示步长
    public void doScheduleTask(){
        log.info("执行定时任务");
        //这里是你的业务逻辑
    }

 上述代码称为静态定时任务,主要依靠 @Scheduled 标签实现,根据其参数cron表达式每隔时间间隔自动执行任务。

cron参数:cron表达式中可填6个值,分别对应 秒 分 时 日 月 周 年。* 表所有可能的值,- 指定范围值,/ 表示步长,?表示不指定值即该值不影响。

0 0 6 * * ?    表示每天6点执行任务
0/5 * * * * ?   表示每5秒执行一次任务
0 * 6 * * ?    表示每天的6点-7点之间的每一分钟都执行一次
0 * 6-8 * * ?  表示每天的6点-9点之间的每一分钟都执行一次
5 10 6 * * ?   表示每天的6:10:05执行一次
0 10,44 14 ? 3 WED  表示三月的每周三的14:10和14:44触发

静态定时任务通过 @Scheduled 标签指定好执行时间,从而执行定时任务,使用较为方便但不太灵活,指定好执行时间后则无法更改。

2.动态定时任务

如果我们需要动态修改定时任务的cron值,我们可以通过继承 SchedulingConfigurer 类来实现:

@Data
@Slf4j
@Component
@ConfigurationProperties(prefix = "scheduled.task")
public class ScheduleTask implements SchedulingConfigurer {

    private String cron;

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(() -> {
            // 业务代码
            log.info("定时任务,currentTime:{}", LocalDateTime.now());

        }, triggerContext -> {
            // 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则
            CronTrigger cronTrigger = new CronTrigger(cron);
            return cronTrigger.nextExecutionTime(triggerContext);
        });
    }
}

application.yml中存放初始的cron值:

scheduled:
  task:
    cron: "0/5 * * * * ?"    #每5秒执行一次

在controller中编写接口,动态修改cron值:

@RestController
@RequiredArgsConstructor
public class seckillController {

    private final ScheduleTask scheduleTask;

    @GetMapping("/test")
    public String test(@RequestParam("cron") String cron){
        scheduleTask.setCron(cron);
        log.info("修改cron为:{}",scheduleTask.getCron());
        return scheduleTask.getCron();
    }

}

然后我们运行程序,并通过接口修改cron值:

SpringBoot——Scheduled定时任务

可以看到,修改之前,每5秒执行一次定时任务;我们将cron修改为每天10点内的每分钟执行后,变成了每分钟才执行一次。

由此实现了自定义的定时任务,并由接口动态修改定时任务的执行时间。

需要注意的是:每次修改完定时任务执行时间之后,需要执行完上一次的定时任务才会让新定义的执行时间生效。

我们由 ScheduleTask.configureTasks() 方法中的上述代码 可以看到,指定下一次任务的执行间隔是由 cronTrigger.nextExecutionTime(triggerContext) 实现的,而该方法会在一次定时任务执行完结后才调用。

SpringBoot——Scheduled定时任务

ScheduleTask.configureTasks() 方法中指定定时任务执行间隔)

所以,我们在上述运行结果中看到,在10:28:30秒执行完一次定时任务,然后在10:28:32我们对cron值进行了修改,定时任务任然按照 0/5 * * * * ? 这一cron值执行了一次,然后才配置了新的cron值。

换言之,如果我们定义了任务每天6点执行,然后某一天将其修改为12点执行,springboot会在第二天的6点执行完后再将cron值修改,然后12点再执行一次。

所以会一定程度上存在重复执行的问题,如果业务需要规避,请谨慎考虑。文章来源地址https://www.toymoban.com/news/detail-416731.html

到了这里,关于SpringBoot——Scheduled定时任务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA 定时任务@Scheduled设置

    例1:每隔5秒执行一次:*/5 * * * * ? 例2:每隔5分执行一次:0 */5 * * * ? 在26分、29分、33分执行一次:0 26,29,33 * * * ? 例3:每天半夜12点30分执行一次:0 30 0 * * ? (注意日期域为0不是24) 每天凌晨1点执行一次:0 0 1 * * ? 每天上午10:15执行一次: 0 15 10 ? * * 或 0 15 10 * * ? 或 0 15

    2023年04月16日
    浏览(54)
  • @Scheduled定时器 定时任务调度:Unexpected error occurred in scheduled task错误

    目录 一、基本使用 二、参数详解 1. @Scheduled(fixedDelay = 5000) 2. @Scheduled(fixedRate = 5000) 3. @Scheduled(cron = “0 0 2 * * ?”) 4.cron表达式 案例 配置文件 写配置的时候,没有提示,解决方案 三、@Scheduled注意事项 四、 @Scheduled 的执行原理  1、加载使用 @Scheduled 注解的类及方法  2、解析

    2024年02月16日
    浏览(51)
  • @Scheduled Cron定时任务——表达式详解

    Cron表达式是一种用于定时任务调度的字符串表达式,它由6个或7个字段组成,分别表示秒、分、时、日、月、周和年。每个字段用空格分隔,字段之间用逗号分隔。 秒(0-59) 分(0-59) 时(0-23) 日(1-31) 月(1-12) 周(0-7,其中0和7都表示周日) 年(可选字段,1970-2099) Cron表达式的语法规则如

    2024年02月09日
    浏览(44)
  • Spring 定时任务@Scheduled 注解中的 Cron 表达式

    Spring 框架提供了强大的定时任务功能,通过 @Scheduled 注解可以方便地定义和管理定时任务。其中,Cron 表达式作为定时任务触发的时间表达式,扮演着重要的角色。本篇博客将详细介绍和讲解 Cron 表达式的语法和常见用法,帮助各位更好地理解和使用 Spring 的定时任务功能。

    2024年02月11日
    浏览(42)
  • Spring Boot中的@Scheduled注解:定时任务的原理与实现

    本文将详细探讨Spring Boot中@Scheduled注解的使用,包括其原理、实现流程、步骤和代码示例。通过本文,读者将能够了解如何在Spring Boot应用中轻松创建和管理定时任务。 在Spring框架中,@Scheduled注解用于标记一个方法,使其能够在固定的时间间隔内自动执行。这个注解主要基于

    2024年02月22日
    浏览(45)
  • 异常 :Unexpected error occurred in scheduled task 。 Spring Boot定时任务调度注解@scheduled

           前言: @Scheduled 注解是 Spring Boot 提供的用于定时任务控制的注解,主要用于控制任务在某个指定时间执行,或者每隔一段时间执行        异常: Unexpected error occurred in scheduled task :计划任务发生意外错误 这个bug是偶然一次遇见的,当时觉得这个描述很简单,肯定

    2024年02月12日
    浏览(48)
  • Spring@Scheduled定时任务接入XXL-JOB的一种方案(基于SC Gateway)

    目前在职的公司,维护着Spring Cloud分布式微服务项目有25+个。其中有10个左右微服务都写有定时任务逻辑,采用Spring @Scheduled这种方式。 Spring @Scheduled定时任务的缺点: 不支持集群:为避免重复执行,需引入分布式锁 死板不灵活:不支持手动执行,单次执行,补偿执行,修改

    2024年02月11日
    浏览(48)
  • springboot定时任务:同时使用定时任务和websocket报错

    项目使用了websocket,实现了消息的实时推送。后来项目需要一个定时任务,使用org.springframework.scheduling.annotation的@EnableScheduling注解来实现,启动项目之后报错 打断点 进入代码发现是这个定时任务的bean为null 由于先写的websocket推送消息,运行正常。之前一个项目只有一个定时任

    2024年02月11日
    浏览(38)
  • springboot 与异步任务,定时任务,邮件任务

    在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x之后,就已经内置了@Async来完美解决这个问题。 SpringBoot 实现比较简单 主启

    2024年02月10日
    浏览(41)
  • 【springboot】springboot定时任务:

    一、文档: 【cron表达式在线生成器】https://cron.qqe2.com/ 二、案例:

    2024年02月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包