Springboot框架通过@Scheduled实现定时任务

2023-10-27

一、开启定时任务方法


Scheduled定时任务是Spring boot自身提供的功能,所以不需要引入Maven依赖包

在项目入口main方法上加注解

@EnableScheduling //开启定时任务

二、不同定时方式的解析


1.fixedDelay和fixedRate,单位是毫秒,它们的区别就是:

  • fixedRate就是每隔多长时间执行一次。(开始------->X时间------>再开始)。如果间隔时间小于任务执行时间,上一次任务执行完成下一次任务就立即执行。如果间隔时间大于任务执行时间,就按照每隔X时间运行一次。

  • 而fixedDelay是当任务执行完毕后一段时间再次执行。(开始--->结束(隔一分钟)开始----->结束)。上一次执行任务未完成,下一次任务不会开始。

2.cron表达式:灵活

举例说明

表达式

说明

0 0 3 * * ?

每天3点执行

0 5 3 * * ?

每天3点5分执行

0 5 3 ? * *

每天3点5分执行,与上面作用相同

0 5/10 3 * * ?

每天3点的 5分,15分,25分,35分,45分,55分这几个时间点执行

0 10 3 ? * 1

每周星期天,3点10分 执行,注:1表示星期天

0 10 3 ? * 1#3

每个月的第三个星期,星期天 执行,#号只能出现在星期的位置

  • 第一位,表示秒,取值0-59

  • 第二位,表示分,取值0-59

  • 第三位,表示小时,取值0-23

  • 第四位,日期天/日,取值1-31

  • 第五位,日期月份,取值1-12

  • 第六位,星期,取值1-7,星期一,星期二...,注:不是第1周,第二周的意思,另外:1表示星期天,2表示星期一。

  • 第七位,年份,可以留空,取值1970-2099

cron中,还有一些特殊的符号,含义如下:

()星号:可以理解为每的意思,每秒,每分,每天,每月,每年...

(?)问号:问号只能出现在日期和星期这两个位置。

(-)减号:表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12

(,)逗号:表达一个列表值,如在星期字段中使用“1,2,4”,则表示星期一,星期二,星期四

(/)斜杠:如:x/y,x是开始值,y是步长,比如在第一位(秒) 0/15就是,从0秒开始,每15秒,最后就是0,15,30,45,60 另:/y,等同于0/y

cron表达式在线:http://cron.qqe2.com/

三、实现定时任务


@Component
public class ScheduledJobs{//表示方法执行完成后5秒再开始执行
    @Scheduled(fixedDelay=5000)
    public void fixedDelayJob() throws InterruptedException{
        System.out.println("fixedDelay 开始:"+newDate());
        Thread.sleep(10*1000);
        System.out.println("fixedDelay 结束:"+newDate());}//表示每隔3秒
    @Scheduled(fixedRate=3000)
    public void fixedRateJob()throws InterruptedException{
        System.out.println("===========fixedRate 开始:"+newDate());
        Thread.sleep(5*1000);
        System.out.println("===========fixedRate 结束:"+newDate());}//表示每隔10秒执行一次
    @Scheduled(cron="0/10 * * * * ? ")
    public void cronJob(){
        System.out.println("=========================== ...>>cron...."+newDate());}}

运行结果如下:从运行结果上看,并未按照预期的时间规律运行。仔细看线程打印,竟然所有的定时任务使用的都是一个线程,所以彼此互相影响。

===========fixedRate 结束:Tue Jul 0919:53:04 CST 2019pool-1-thread-1
fixedDelay 开始:Tue Jul 0919:53:04 CST 2019pool-1-thread-1
fixedDelay 结束:Tue Jul 0919:53:14 CST 2019pool-1-thread-1===========fixedRate 开始:Tue Jul 0919:53:14 CST 2019pool-1-thread-1===========fixedRate 结束:Tue Jul 0919:53:16 CST 2019pool-1-thread-1===========fixedRate 开始:Tue Jul 0919:53:16 CST 2019pool-1-thread-1===========fixedRate 结束:Tue Jul 0919:53:18 CST 2019pool-1-thread-1===========================...>>cron....Tue Jul 0919:53:18 CST 2019pool-1-thread-1===========fixedRate 开始:Tue Jul 0919:53:18 CST 2019pool-1-thread-1===========fixedRate 结束:Tue Jul 0919:53:20 CST 2019pool-1-thread-1===========fixedRate 开始:Tue Jul 0919:53:20 CST 2019pool-1-thread-1===========fixedRate 结束:Tue Jul 0919:53:22 CST 2019pool-1-thread-1===========fixedRate 开始:Tue Jul 0919:53:22 CST 2019pool-1-thread-1===========fixedRate 结束:Tue Jul 0919:53:24 CST 2019pool-1-thread-1
fixedDelay 开始:Tue Jul 0919:53:24 CST 2019pool-1-thread-1
fixedDelay 结束:Tue Jul 0919:53:34 CST 2019pool-1-thread-1===========================...>>cron....Tue Jul 0919:53:34 CST 2019pool-1-thread-1===========fixedRate 开始:Tue Jul 0919:53:34 CST 2019pool-1-thread-1===========fixedRate 结束:Tue Jul 0919:53:36 CST 2019pool-1-thread-1===========fixedRate 开始:Tue Jul 0919:53:36 CST 2019pool-1-thread-1===========fixedRate 结束:Tue Jul 0919:53:38 CST 2019pool-1-thread-1===========fixedRate 开始:Tue Jul 0919:53:38 CST 2019pool-1-thread-1===========fixedRate 结束:Tue Jul 0919:53:40 CST 2019pool-1-thread-1===========fixedRate 开始:Tue Jul 0919:53:40 CST 2019pool-1-thread-1===========fixedRate 结束:Tue Jul 0919:53:42 CST 2019pool-1-thread-1===========fixedRate 开始:Tue Jul 0919:53:42 CST 2019pool-1-thread-1===========fixedRate 结束:Tue Jul 0919:53:44 CST 2019pool-1-thread-1===========fixedRate 开始:Tue Jul 0919:53:44 CST 2019pool-1-thread-1===========fixedRate 结束:Tue Jul 0919:53:46 CST 2019pool-1-thread-1===========fixedRate 开始:Tue Jul 0919:53:46 CST 2019pool-1-thread-1===========fixedRate 结束:Tue Jul 0919:53:48 CST 2019pool-1-thread-1
fixedDelay 开始:Tue Jul 0919:53:48 CST 2019pool-1-thread-1
fixedDelay 结束:Tue Jul 0919:53:58 CST 2019pool-1-thread-1===========================...>>cron....Tue Jul 0919:53:58 CST 2019pool-1-thread-1

四、解决定时任务单线程运行的问题


@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer{
 
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar){
        taskRegistrar.setScheduler(scheduledTaskExecutor());}
 
    @Bean
    public Executor scheduledTaskExecutor(){return Executors.newScheduledThreadPool(3);//指定线程池大小}}

再次运行上面的程序,运行时间规律就符合期望了。

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

Springboot框架通过@Scheduled实现定时任务 的相关文章

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口

随机推荐

  • 打开一个php网页出现2个ip,php根据ip地址查地区

    自己以前做过一个程序 根据discuz里面的ip查询改的 ip地址所属地区计算 修改自 discuz 使用dicuz tinyipdata数据文件 将一些英文提示修改为汉字 is simple true的话显示到市 false显示到网通电信
  • maven项目中添加MySql依赖失败(以及maven的安装到maven项目的使用过程)

    maven项目中添加MySql依赖失败 以及maven的安装到maven项目的使用过程 1 maven项目中添加MySql依赖失败 报错信息 Dependency mysql mysql connector java not found 解
  • Cadence Allegro PCB设计88问解析(三十) 之 Allegro中 PCB的3D模型导出

    一个学习信号完整性仿真的layout工程师 在进行PCB投板之前 往往需要将PCB的结构发给结构的同事确认 一般会导出DXF和EMN文件 或者导出3D模型 3D模型包含版型 器件的实际3D模型等等 可以比较直观的看到PCB板上的器件情况 下
  • 【git 错误】git 使用中的问题汇总 不定期更新 git报错 Please enter a commit message to explain

    1 Please enter a commit message to explain why this merge is necessary 解决办法 1 按键盘字母 i 进入insert模式 2 修改最上面那行黄色合并信息 可以不修改 3
  • ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26‘ not foun Python GDAL

    前言 更新完pytorch1 9 0之后 突然GDAL包不能用了 但是代码调试的时候是正常的 本文给出具体的解决过程 提示一下 其实这种因为软件更新导致某个动态库不能通用的情况 一般的解决方法 就是在本机上查找一下有没有别的地方有 这样的解
  • ADAS先进驾驶辅助系统(Advanced Driver Assistant System)

    先进驾驶辅助系统 Advanced Driver AssistantSystem 简称ADAS 是利用安装于车上的各式各样的传感器 可侦测光 热 压力等变数 在第一时间收集车内外的环境数据 进行静 动态物体的辨识 侦测与追踪等技术上的处理
  • YOLOv7——目标检测数据集划分篇

    法一 1 准备VOC数据集 将所有数据集图片放入JPEGImages文件夹中 所有的图片对应的xml文件放入Annotations中 ImageSets文件夹中创建Main文件夹 暂时Main文件夹为空 文件夹结构 datasets Ann
  • 数据标准详细概述-2022

    1 数据标准的是什么 在实际的工作生产中 我们一般会参照国家标准 地方标准 行业标准等来进行具体的活动 来确保我们生成过程符合监管要求 便于上下游协同等 于是我们会见到如下的标准指导文件 同样 数据标准也会以文件的形式存在 在除了国标 行标
  • qq人脸更换_QQ安全中心现在怎么替换人脸设置或删除人脸?

    以下内容收集自网络 题主可以参考一下 1 我们从手机中打开QQ安全中心 如果还不是最新版本的话 请先升级到最新版本 2 在QQ安全中心首页 点击最下方的 工具 按钮 3 在 工具 页面 点击打开 实验室 这个图标 4 在打开的界面 点击打开
  • 四阶魔方玩法总结V1.0

    四阶魔方玩法总结V1 0 1 引言 今写此文 我主要是为了方便自己再次玩其魔方的时候 可以快速的想起 避免又从头学起 毕竟自己学会的 理解的 写出来的东西 再次玩魔方的时候 仅仅是回顾和追忆的过程 不存在学习 理解和消化的过程 避免再次浪费
  • 12.大数据之Hive性能优化

    hive性能调优 1 HADOOP计算框架特性 数据量大不是问题 数据倾斜是个问题 jobs数比较多的作业运行效率相对比较低 比如即使有几百行的表 如果多次关联多次汇总 产生十几个jobs 耗时很长 原因是map reduce作业初始化的时
  • 二叉树类型的常考选择题知识储备(二叉树的性质)

    1 若规定 根节点的层数为 1 则 一个非空二叉树的 第 i 层 上最多有 2i 1 i gt 0 个结点 2 若规定只有根节点的二叉树的深度为1 则 深度为 K 的二叉树的 最大结点数是 2k 1 k gt 0 3 对于任意一个二叉树 如
  • Angular管道操作符(

    一 模板表达式操作符 模板表达式语言使用了JavaScript 语法的子集 并补充了几个用于特定场景的特殊操作符 管道操作符 安全导航操作符 二 管道操作符 在绑定之前 表达式的结果可能需要一些转换 例如 可能希望吧数字显示成金额 强制文本
  • 【Web3】Mnemonic Word Create Wallet

    目录 Create Mnemonic Word 介绍 一 根据 Mnemonic Word 生成密钥对 keypair 二 通过 keypair 获取 Wallet 地址 和 private key 代码 Create Mnemonic W
  • bash: ./make.sh: /bin/sh^M: 解释器错误: 没有那个文件或目录

    原因 在Linux运行 sh文件时报上述错误 原因是因为该文件在windows系统上打开过 关闭后其中的空格符号和Linux的不同 导致这个报错 可以通过sed命令与正则的配合将文件中的空格符号替换成linux的空格 解决方法 sed i
  • 实验6

    一 MPEG 1 Audio LayerII编码器原理 1 多相滤波器组 将PCM样本变换到32个子带的频域信号 如果输入的采样频率为48kHz 那么子带的频率宽度为48 2 32 0 75Hz 缺点 1 等带宽的滤波器组与人类听觉系统的临
  • MSCOCO数据标注详解(超详细)

    博主大大 风吴痕 对MSCOCO的讲解 超级详细而且有代码举例 转发收藏 后面方便自己查看 https blog csdn net wc781708249 article details 79603522
  • SQLite 3.7.13的加密解密

    原文链接 http lancelot blog 51cto com 393579 940805 http lancelot blog 51cto com 393579 940808 http lancelot blog 51cto com
  • stata移动平均插值法mipolate命令

    stata移动平均插值法mipolate命令 xtset id year by id mipolate x3 year gen x3 1 idw 4 idw表示取移动平均的项数 结果
  • Springboot框架通过@Scheduled实现定时任务

    一 开启定时任务方法 Scheduled定时任务是Spring boot自身提供的功能 所以不需要引入Maven依赖包 在项目入口main方法上加注解 EnableScheduling 开启定时任务 二 不同定时方式的解析 1 fixedD