SpringBoot:@Schedule定时任务

2023-11-06

一,@Schedule

    SpringBoot内置了Sping Schedule定时框架,通过注解驱动方式添加所注解方法到定时任务,根据配置定时信息定时执行

二,定时任务实现

    1,开启定时任务

package com.gupao.springboot;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableAsync
// 开启定时任务
@EnableScheduling
@MapperScan(basePackages = {"com.gupao.springboot.*.mapper"})
public class GupaoSpringbootApplication {

	public static void main(String[] args) {
		SpringApplication.run(GupaoSpringbootApplication.class, args);
	}

}

    2,定时任务,方法上有注释

package com.gupao.springboot.schedules;

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

import java.util.Date;

/**
 * 定时任务演示
 * @author pj_zhang
 * @create 2018-12-26 21:19
 **/
@Component
public class ScheduleTestTask {

    // 如果方法执行时间超过定时器时间, 方法执行完成后直接执行任务
    @Scheduled(fixedRate = 3000)
    public void test_1() {
        System.out.println("fixedRate : " + new Date());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    // 方法执行完成后, 停留间隔时间, 再次执行该方法
    // 不因为方法执行时间长度影响定时器
    @Scheduled(fixedDelay = 3000)
    public void test_2() {
        System.out.println("fixedDelag : " + new Date());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    // 固定间隔时间执行, 方法执行完成后, 按照间隔时间点再次执行该方法
    // 比如方法执行5s, 定时间隔为3s, 则中间有一次执行不上, 从第6s开始下一次执行
    @Scheduled(cron = "0/3 * * * * *")
    public void test_3() {
        System.out.println("corn       : " + new Date());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

    3,测试

    * 可以看到三个线程按照线程争抢方式依次执行,与三个定时器并行不相符,原因何在?

    * 进入Spring Schedule源码org.springframework.scheduling.config.ScheduledTaskRegistrar#scheduleTasks

protected void scheduleTasks() {
        if(this.taskScheduler == null) {
            // 从这一行可以看出, 定时调度任务初始化时候初始化了一个单线程的线程池
            // 所以在定时任务调度时候, 如果定时任务过多, 就会存在线程争抢
            // 而且每一次也只会有一个定时任务运行
            this.localExecutor = Executors.newSingleThreadScheduledExecutor();
            this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
        }

    }

三,定时任务线程池配置

    1,可以通过配置信息更改定时调度任务线程池数量

package com.gupao.springboot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.util.concurrent.Executors;

/**
 * 更改定时器线程池初始化数量配置信息
 * @author pj_zhang
 * @create 2018-12-26 21:27
 **/
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        // 修改初始化线程数为100
        scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(100));
    }
}

    * 执行结果,根据时间点可以看到,各个定时任务并行执行,不存在线程争抢

四,corn表达式

    1,先放个大招,在线corn表达式生成器

          * http://cron.qqe2.com/

    2,表达式基本公式

          * * * * * * * 分别对应,七个*分别对应单位为:秒,分,时,日,月,星期,年

    3,字段含义

字段 取值范围 特殊字符
0~59的整数 ,- * /
0~59的整数 ,- * /
0~23的整数 ,- * /
1~31的整数 ,- * ? / L W
1~12的整数 ,- * /
星期 1~7的整数或者SUN~SAT(1=SUN) ,- * ? / L #
1970~2099 ,- * /

 

 

 

 

 

 

 

 

 

        * "," :表示列出枚举值,例如分钟使用5,20,则表示5和20分钟各执行一次

        * "-" :表示范围,例如分钟使用5-20,表示5-20分钟每分钟触发一次

        * "*" :表示匹配该域任意值,例如分钟使用*,表示每分钟都会执行一次

        * "/" :表示起始时间开始触发,以后每隔多长时间触发一次,例如秒使用0/3,表示从0开始触发,后每三分钟触发一次

        * "?":只能在日和星期使用,表示匹配任意值,但实际不会;因为日和星期可能会存在冲突,如果想表示每月20号0点执行,则需要写为 0 0 0 20 * ?,星期位必须写为?,虽然概念上*也表示通配

        * "L" :表示最后,只出现在日和星期;例如在星期的5L,表示最后一个星期五触发

        * "W" :表示有效工作日(周一-周五),只出现在日,如果指定的当天在某月刚好为周末,则就近取周五或周一执行

        * "LW" :连用表示每个月最后一个星期五,只在日使用

        * "#" :用于确定第几个星期的星期几,只在星期使用;例如2#3,表示在每月的第三个星期一

    4,常用表达式实例

     -- 0/3 * * * * ? :表示每三秒钟执行一次

     -- 0 0 2 1 * ? :表示每月1号凌晨两点执行任务

     -- 0 15 10 ? * MON-FRI :表示周一到周五每天早上10:15执行

     -- 0 15 10 ? * 6#3   每月的第三个星期五上午10:15触发 

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

SpringBoot:@Schedule定时任务 的相关文章

随机推荐

  • JAVA实现用户输出正整数重复出现的次数并打印(最大数字不超过10)

    package day1 实现用户输出正整数重复出现的次数并打印 public class TestSameNum public static void main String args int arr 1 2 3 4 5 6 7 1 2
  • vue使用动态样式与计算属性实现多变量判断

    一 动态class绑定 代码 class的计算属性着重于减少页面内含大量逻辑判断导致代码阅读性差
  • 垃圾分类图片数据集分享-约10w张数据集

    1 获取方式 点赞本博客 评论区留邮箱 博主在会发送 私信博主 访问的人太多了 需要私信联系 截至到2021 03 30评论区所有邮箱已无偿发送 图片数据集直接留邮箱即可 2 问题描述 最近在做一个相关项目 从网上整理了许许多多的有关于垃圾
  • 多维时序

    多维时序 MATLAB实现DNN深度神经网络多变量时间序列预测 考虑历史特征的影响 多指标 多图输出 目录 多维时序 MATLAB实现DNN深度神经网络多变量时间序列预测 考虑历史特征的影响 多指标 多图输出 预测效果 基本介绍 模型结构
  • .Net Core with 微服务 - 架构图

    上一次我们简单介绍了什么是微服务 NET Core with 微服务 什么是微服务 介绍了微服务的来龙去脉 一些基础性的概念 有大佬在评论区指出说这根本不是微服务 由于本人的能力有限 大概也只能理解到这个层次 先不管它到底是不是微服务吧 既
  • 「五度易链」助力园区招商,引优质企业 精准甄别 全程管理,促产业高质发展

    近年 无数产业园区已迈入数字化转型阶段 大数据招商被深度应用 缺乏招商线索的局面已一去不返 但面对鳞萃比栉 纷繁芜杂的各种招商标的信息 又是让园区招商工作者眼花缭乱 举棋不定 难以抉择 那么该如何进行项目甄别 判断企业落地价值呢 五度易链
  • 快手短视频微信小程序端自动下单工具

    快手小店微信小程序虽然关闭了 但是还有个快手短视频 其实就是快手小店的产品 在直播售卖 抓包短视频直播下单 根据小程序端下单 写个自动下单工具 众所周知 快手CK 很长时间都有效 打开软件 打开PC微信 快手短视频小程序 进入直播 随便找一
  • Wolfram Mathematica 安装与使用

    1 Wolfram Mathematica 9 安装 各大网站几乎都有Wolfram Mathematica 9学习软件 大学 高等数学 里面涉及的的函数图形几乎都可以使用GeoGebra 5来做图 GeoGebra的功能十分强大 而且是免
  • Centos 8二进制安装Mysql-8.0.23

    1 mysql tar包的下载 下载官网 https downloads mysql com archives community 2 解压 root cent8 yzil tar xf mysql 8 0 23 linux glibc2
  • 基于NB-IoT物联网智能运维箱整体解决方案

    一 方案背景 雪亮工程 智慧交通 水利监控 环保监控等系统大多安装于户外 设备量级大 分布广 易受到恶劣环境和人为破坏等因素影响 导致系统故障率高 可用性差 传统人工维保存在维护成本高 效率低的问题 难以保证设备的高在线率 在物联网 边缘计
  • 代码行数统计小工具

    一 先下载好SourceCounter小工具 解压 然后直接打开文件夹中的SourceCounter exe 如果没有找到此工具的下载链接 点这里下载 二 选择代码类型 勾选上所有类型 三 双击点开后 选择文件夹 就可以直接统计出字数了
  • 前端笔记(4)JavaScript宏观与微观任务

    宏观和微观任务 在 ES3 和更早的版本中 JavaScript 本身还没有异步执行代码的能力 这也就意味着 宿主环境传递给 JavaScript 引擎一段代码 引擎就把代码直接顺次执行了 这个任务也就是宿主发起的任务 但是 在 ES5 之
  • 顺序表的基本操作(C语言实现)

    顺序表 前言 本文主要讲线性表的其中一种 那就是顺序表 顺序表就是采用顺序储存方式来存储数据 所谓顺序存储 就是数据在内存上的地址同样为连续储存 中间不允许有空 有间隔 顺序表的优点在于支持随机访问 就是通过下标来访问元素 缺点是插入 删除
  • iBatis resultMap报错 nullValue完美解决

    错误信息 SQLErrorCodesFactory Database product name cached for DataSource org apache commons dbcp BasicDataSource 19c5048 na
  • OSWatcher.sh脚本说明

    OSWatcher sh脚本位于oswbb目录下 Oracle 19c数据库中脚本的路径是 u01 app oracle product 19 0 0 dbhome 1 suptools tfa release tfa home ext o
  • Maven中dependencyManagement作用说明

    备注 今天有好些实习的同事问到Maven中关于dependencyManagement和普通dependencies的区别 说多了 麻烦 记录一下 在Maven多模块的时候 管理依赖关系是非常重要的 各种依赖包冲突 查询问题起来非常复杂 于
  • python网络爬虫有那些实例_python爬虫经典例子有哪些

    python爬虫例子 首先导入爬虫的库 生成一个response对象 然后设置编码格式 并打印状态码 最后输出爬取的信息 代码为 print response text python爬虫例子 1 爬取强大的BD页面 打印页面信息 第一个爬虫
  • 毕业设计-基于机器视觉的焊缝图像处理研究- OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 焊缝识别系统设计 二 焊缝图像预处理 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要
  • 设置读取plc时间_Visual Studio 2010-C#跟西门子1200(Sharp7)窗体控制④-循环读取

    Visual Studio 2010 C 跟西门子1200 Sharp7 窗体控制 循环读取 上期回顾 上期主要是对单个按钮 按下后能够同时置位PLC的多个位 本期做一个读取PLC的OK NOK的统计数据的C 标签 先创建一个标签 在设定一
  • SpringBoot:@Schedule定时任务

    一 Schedule SpringBoot内置了Sping Schedule定时框架 通过注解驱动方式添加所注解方法到定时任务 根据配置定时信息定时执行 二 定时任务实现 1 开启定时任务 package com gupao springb