springboot定时任务详解

2023-11-01


在我们开发项目过程中,经常需要定时任务来帮助我们来做一些内容, Spring Boot 默认已经帮我们实行了,只需要添加相应的注解就可以实现

一、基于注解(静态)

1、添加依赖

  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
  </dependency>

2、创建定时任务

定时任务1:

@Configuration
@EnableScheduling
public class SchedulerTask1 {

    private int count=0;

    @Scheduled(cron="*/6 * * * * ?")
    private void process(){
        System.out.println("this is scheduler task runing  "+(count++));
    }

}

定时任务2:

@Configuration
@EnableScheduling
public class SchedulerTask2 {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 6000)
    public void reportCurrentTime() {
        System.out.println("现在时间:" + dateFormat.format(new Date()));
    }

}

结果如下:

this is scheduler task runing  0
现在时间:09:44:17
this is scheduler task runing  1
现在时间:09:44:23
this is scheduler task runing  2
现在时间:09:44:29
this is scheduler task runing  3
现在时间:09:44:35

3、参数说明

@Configuration用于标记配置类,兼备Component的效果。

@EnableScheduling表示开启定时任务

@Scheduled 参数可以接受两种定时的设置,一种是我们常用的cron="*/6 * * * * ?",一种是 fixedRate = 6000,两种都表示每隔六秒打印一下内容。

fixedRate 说明

  • @Scheduled(fixedRate = 6000) :上一次开始执行时间点之后6秒再执行

  • @Scheduled(fixedDelay = 6000) :上一次执行完毕时间点之后6秒再执行

  • @Scheduled(initialDelay=1000, fixedRate=6000) :第一次延迟1秒后执行,之后按 fixedRate 的规则每6秒执行一次

cron属性,通过表达式形式指定任务执行规则,同样也是从上一次任务执行完毕开始计时。表达式规则如下:

每个位置的规则如下:

在这里插入图片描述

备注:

  • 星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”。
  • 问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于占位符。
  • 减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12。
  • 逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五。
  • 斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在秒数字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y。
  • L:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7。但是,如果L出现在星期字段里,而且在前面有一个数值X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五。
  • W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。W字符串只能指定单一日期,而不能指定日期范围。
  • LW组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日。
  • 井号(#):该字符只能在星期字段中使用,表示当月某个工作日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发。
  • C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。
  • cron表达式对大小写不敏感。

二、基于接口(动态)

1、添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

2、添加数据库记录

开启本地数据库mysql,随便打开查询窗口,然后执行脚本内容,如下:

DROP DATABASE IF EXISTS `socks`;
CREATE DATABASE `socks`;
USE `SOCKS`;
DROP TABLE IF EXISTS `cron`;
CREATE TABLE `cron`  (
  `cron_id` varchar(30) NOT NULL PRIMARY KEY,
  `cron` varchar(30) NOT NULL  
);
INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');

在这里插入图片描述

然后在application.properties文件添加数据源

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/socks?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3、创建定时器

数据库准备好数据之后,我们编写定时任务,注意这里添加的是TriggerTask,目的是循环读取我们在数据库设置好的执行周期,以及执行相关定时任务的内容。
具体代码如下:

@Configuration      //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling   // 2.开启定时任务
public class DynamicScheduleTask implements SchedulingConfigurer {

    @Autowired
    private CronMapper cronMapper;

    /**
     * 执行定时任务.
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

        taskRegistrar.addTriggerTask(
                //1.添加任务内容(Runnable)
                () -> System.out.println("执行动态定时任务: " + LocalDateTime.now().toLocalTime()),
                //2.设置执行周期(Trigger)
                triggerContext -> {
                    //2.1 从数据库获取执行周期
                    String cron = cronMapper.selectByPrimaryKey("1").getCron();
                    //2.2 合法性校验.
                    if (StringUtils.isEmpty(cron)) {
                        // Omitted Code ..
                    }
                    //2.3 返回执行周期(Date)
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                }
        );
    }

}

4、启动测试

然后打开Navicat ,将执行周期修改为每10秒执行一次,查看控制台,发现执行周期已经改变,并且不需要我们重启应用,十分方便。如图:

在这里插入图片描述

三、Quartz

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。

1、添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

2、编写任务类

package com.cn.service;
 
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class MyQuartz extends QuartzJobBean {
 
    private final Logger log = LoggerFactory.getLogger(MyQuartz.class);
 
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        log.info("hello quartz");
    }
 
}

3、编写配置类

package com.cn.config;

import com.cn.service.MyQuartz;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class QuartzConfig {
 
    @Bean
    public JobDetail myQuartz() {
        return JobBuilder.newJob(MyQuartz.class).withIdentity("MyQuartz").storeDurably().build();
    }
 
    @Bean
    public Trigger studentRankQuartzTrigger() {
        return TriggerBuilder.newTrigger().forJob(myQuartz())
                .withIdentity("MyQuartz")
                .withSchedule(DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule().withInterval(5,		
                 DateBuilder.IntervalUnit.SECOND))
                .build();
    }
}

4、启动项目

每隔5秒打印一次"hello quartz"

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot定时任务详解 的相关文章

随机推荐

  • PageHelper分页原理(源码)

    PageHelper分页原理 PageHelper是我们经常使用的一个分页插件 之前咱们一直处于使用阶段的 今天咱们去探究一下其中的原理 SQL语句实现分页查询知识 就不在赘述了 LIMIT i a i 是指查询的索引值 默认是0 a 是指
  • CH7-IO

    实验7 1 批量操作文件功能 任务介绍 1 任务描述 在日常工作中 经常会遇到批量操作系统文件的事情 通常情况下 只能手动重复的完成批量文件的操作 这样很是费时费力 本案例要求编写一个文件管理器 实现文件的批量操作 文件管理器具体功能要求如
  • mysql架构与存储引擎

    文章目录 一 MySQL体系架构 1 1 网络连接层 1 2 服务层 MySQL Server 1 3 存储引擎层 Pluggable Storage Engines 1 4 系统文件层 File System 1 4 1 日志文件 1 4
  • 【云原生•监控】基于Prometheus实现自定义指标弹性伸缩(HPA)

    云原生 监控 基于Prometheus实现自定义指标弹性伸缩 HPA 什么是弹性伸缩 Autoscaling即弹性伸缩 是Kubernetes中的一种非常核心的功能 它可以根据给定的指标 例如 CPU 或内存 自动缩放Pod副本 从而可以更
  • 蓝牙之二十-设备类型

    蓝牙设备在扫描时会发现设备的类型 蓝牙图标有耳机 打印机 电话等等 蓝牙协议栈里有一个叫做基带的字段 基带的分配编号指明查询访问码和设备 服务类别 CoD 字段 通用及设备特定的查询访问码 DIAC 查询访问码 IAC 是寻找蓝牙设备和服务
  • document.documentElement.scrollTop(获取滚动条位置)

    document documentElement scrollTop 收集关于scrollTop信息 要获取当前页面的滚动条纵坐标位置 用 document documentElement scrollTop 而不是 document bo
  • SQL后计算的利器

    现代应用开发中 通常只用SQL实现简单的数据存取动作 而主要的计算过程和业务逻辑直接在应用程序中实现 主要原因在于 过于复杂的SQL很难调试 编写 阅读 修改 SQL有方言特征 大量使用SQL后 会导致程序很难移植 架构方面要求业务逻辑在应
  • 通讯录管理系统——退出系统功能

    功能描述 退出通讯录系统 思路 根据用户不同的选择 进入不同的功能 可以选择switch分支结构 进行整个构建 当用户选择0时候 执行退出 选择其他先不做操作 也不会退出程序 创建用户选择输入的变量 int select 0 which t
  • Windows下搭建Telnet服务器

    1 开启Telnet功能 控制面板 gt 程序 gt 启用或关闭Windows功能 2 启动Telnet服务 打开计算机管理 双击Telnet服务 选择 启动 3 访问telnet服务 在cmd命令中输入 telnet ip 输入 y 进入
  • STL 容器详解——string 类

    目录 传统艺能 嘛是STL 内容 重要性 string 类 对象的常见构造 string 的遍历 append getline string的拷贝 两种 swap 传统艺能 小编是双非本科大一菜鸟不赘述 欢迎大佬指点江山 QQ 131936
  • 决策论——后悔准则

    策略 每种环境下 算出与该环境下最大值的差值 找出每种策略在不同环境下的最大差值 在这些最大值之中找到最小值 解析 每种环境下都有好坏 采用不通策略也有好坏 怎么评价好坏 采取了某个策略 不想与最好的情况相差太远 这样不至于过于后悔 缺点
  • git 基本命令

    删除分支 本地 git branch d branch name 远程 git push origin delete branch name https方式每次都要输入密码 按照如下设置即可输入一次就不用再手输入密码的困扰而且又享受http
  • C++——深拷贝和浅拷贝

    1 浅拷贝与深拷贝的区别 浅拷贝 默认拷贝函数 将原对象或原数组的引用直接赋给新对象 新数组 新对象 新数组只是原对象的一个引用 深拷贝 创建一个新的对象和数组 将原对象的各项属性的 值 数组的所有元素 拷贝过来 是 值 而不是引用 深拷贝
  • Spring JdbcTemplate

    Spring JdbcTemplate Spring JdbcTemplate基本使用 JdbcTemplate概述 它是spring框架中提供的一个对象 是对原始繁琐的Jdbc API对象的简单封装 spring框架为我们提供了很多的操作
  • linux把一个文件和子目录下面的内容改为所有用户可读写执行

    要将一个文件和子目录下的内容设置为所有用户可读 写和执行权限 可以使用chmod命令 假设您要修改的文件和子目录所在的路径为 path to file or directory 可以运行以下命令 chmod R 777 path to fi
  • 虚拟机安装linux系统,重启后无法联网

    虚拟机安装linux系统 重启后无法联网 使用环境 触发问题 临时解决问题 使用环境 manjaro 18 deepin15 8 fedoras 29 等 有nmcli网络套件管理 无法使用systemctl restart network
  • 尚硅谷VUE项目实战,前端项目-尚品汇(大型\重磅),笔记

    项目资料 前端资料 https gitee com jch1011 shangpinhui 0415 后台资料 https gitee com jch1011 guigu B站直达 https www bilibili com video
  • 保研之路——上交大电子系直博

    上交大电子系直博 个人情况 高校复试参与情况 上交电子系直博 6 15 结语 嗯 抱着不白花这么多路费住宿费的初衷准备写一个保研经验贴 希望学弟学妹少花点钱吧orz 我的战术大概是只要学校给我发了邀请我就去 除了时间冲突的情况 事实证明 我
  • HITiCS大作业——程序人生

    计算机系统 大作业 题 目 程序人生 Hello s P2P 专 业 计算机科学与技术 学 号 2021112155 班 级 2103103 学 生 谷佳熠 指 导 教 师 刘宏伟 计算机科学与技术学院 2022年11月 摘 要 本篇文章详
  • springboot定时任务详解

    文章目录 一 基于注解 静态 1 添加依赖 2 创建定时任务 3 参数说明 二 基于接口 动态 1 添加依赖 2 添加数据库记录 3 创建定时器 4 启动测试 三 Quartz 1 添加依赖 2 编写任务类 3 编写配置类 4 启动项目 在