SpringBoot执行定时任务

2023-11-10

SpringBoot执行定时任务

1、在启动类中加入@EnableScheduling来开启定时任务。

复制代码

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class DemoApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoApplication.class);
    }
    
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

复制代码

 

2、创建定时任务类

复制代码

package com.example.demo;

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

import lombok.extern.slf4j.Slf4j;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Slf4j
@Component
//@Async //可加在类或方法,开启异步事件的支持
public class SchedulerTask {
    
    Logger log = LoggerFactory.getLogger(SchedulerTask.class);
    
    //cron表达式:每隔5秒执行一次
    @Scheduled(cron = "0/5 * * * * *")
    public void scheduled(){
        log.info("使用cron: {}");
    }
    //上一次 启动时间点之后每5秒执行一次
    //如果任务时长超过 fixedRate不会启动多个任务实例,只不过会在上次任务执行完后立即启动下一轮
    //除非这个类或 Job 方法用 @Async 注解了,使得任务不在 TaskScheduler 线程池中执行,而是每次创建新线程来执行。
    @Scheduled(fixedRate = 5000)
    public void scheduled1() {
        log.info("使用fixedRate {}");
    }
    //上一次 结束时间点之后 每5秒执行一次
    @Scheduled(fixedDelay = 5000)
    public void scheduled2() {
        log.info("使用fixedDelay {}");
    }
    //第一次延迟 10秒执行,之后按照fixedRate的规则每6秒执行
    @Scheduled(initialDelay = 10000,fixedRate = 6000)
    public void scheduled3() {
        log.info("使用initialDelay {}");
    }
}

复制代码

 

控制台输出如下:

2018-10-26 12:17:45.001 INFO 100760 --- [ool-20-thread-1] com.example.demo.SchedulerTask : 使用cron: {}
2018-10-26 12:17:48.640 INFO 100760 --- [ool-20-thread-1] com.example.demo.SchedulerTask : 使用fixedRate {}
2018-10-26 12:17:48.640 INFO 100760 --- [ool-20-thread-1] com.example.demo.SchedulerTask : 使用fixedDelay {}
2018-10-26 12:17:50.001 INFO 100760 --- [ool-20-thread-1] com.example.demo.SchedulerTask : 使用cron: {}
2018-10-26 12:17:53.640 INFO 100760 --- [ool-20-thread-1] com.example.demo.SchedulerTask : 使用fixedRate {}
2018-10-26 12:17:53.640 INFO 100760 --- [ool-20-thread-1] com.example.demo.SchedulerTask : 使用initialDelay {}
2018-10-26 12:17:53.641 INFO 100760 --- [ool-20-thread-1] com.example.demo.SchedulerTask : 使用fixedDelay {}


可见这几个定时任务都使同一个线程串行执行,如图中ool-20-thread-1所示。


3、多线程定时任务
(1)新建一个AsyncConfig配置类类

复制代码

package com.example.demo;

import java.util.concurrent.Executor;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration //表明该类是一个配置类
@EnableAsync //开启异步事件的支持
public class AsyncConfig {
    //此处成员变量应该使用@Value从配置中读取
    private int corePoolSize = 10;
    private int maxPoolSize = 200;
    private int queueCapacity = 10;
    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.initialize();
        return executor;
    }
}

复制代码

(2)在定时任务的类或者方法上添加@Async,如

@Slf4j
@Component
@Async
public class SchedulerTask 

控制台输出如下,使用多个线程:
2018-10-26 12:16:20.001 INFO 100760 --- [ taskExecutor-4] com.example.demo.SchedulerTask : 使用cron: {}
2018-10-26 12:16:20.792 INFO 100760 --- [ taskExecutor-2] com.example.demo.SchedulerTask : 使用initialDelay {}
2018-10-26 12:16:22.792 INFO 100760 --- [ taskExecutor-3] com.example.demo.SchedulerTask : 使用fixedRate {}
2018-10-26 12:16:22.836 INFO 100760 --- [ taskExecutor-6] com.example.demo.SchedulerTask : 使用fixedDelay {}
2018-10-26 12:16:25.001 INFO 100760 --- [ taskExecutor-5] com.example.demo.SchedulerTask : 使用cron: {}
2018-10-26 12:16:26.792 INFO 100760 --- [ taskExecutor-7] com.example.demo.SchedulerTask : 使用initialDelay {}

 

附1,

Slf4j需要在pom.xml中添加配置

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
          </dependency>

附2,

cron表达式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year或 
Seconds Minutes Hours DayofMonth Month DayofWeek
每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是: 
(1)*:表示匹配该域的任意值,假如在Minutes域使用*, 即表示每分钟都会触发事件。
(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和 DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。 
(3)-:表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次 
(4)/:表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次. 
(5),:表示列出枚举值值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。 
(6)L:表示最后,只能出现在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。 
(7)W: 表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一 到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 
(8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。 
(9)#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的
星期三。
例子:
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?

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

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

SpringBoot执行定时任务 的相关文章

  • Database returned an invalid datetime value. Are time zone definitions for your database installed?

    Django gt python manage py runserver时报错 Database returned an invalid datetime value Are time zone definitions for your d
  • GCC编译选项参数介绍

    gcc和g 分别是gnu的c和c 编译器 下面是整理的常用编译选项参数 1 x 设定文件所使用的语言 使文件后缀名无效 如下 执行完后生成test o gcc c x c test jpg 2 c 只编译生成目标文件即 o 只编译不链接生成
  • Spring Boot通过lombok提供的Slf4j省略日志的创建操作

    上文 Spring Boot将声明日志步骤抽离出来做一个复用类中 我们写了个创建日志的公开类 但这么简单的东西 自然有人会将它写好 lombok已经 提供出了这个工具 首先 我们需要在 pom xml 中加上这样一段代码
  • NB-IOT/Lora/Zigbee/WIFI/蓝牙无线组网方式的对比

    NB IOT Lora Zigbee WIFI 蓝牙无线组网方式的对比 LoRa LoRa 长 距离 是由Semtech公司开发的一种技术 典型工作频率在美国是915MHz 在欧洲是868MHz 在亚洲是433MHz LoRa的物理层 PH
  • 互联网摸鱼日报(2023-09-12)

    互联网摸鱼日报 2023 09 12 36氪新闻 东方树叶 被中年男人买疯了 马斯克重申 特斯拉将取消 实体后视镜 一封钓鱼电邮背后的AI攻防战 苹果iPhone 15系列预测分析 哪些靠谱 该选哪个版本 纯电版丰田埃尔法 难以重现燃油版的
  • PMOS 型的 LDO

    在前面讲 NMOS LDO 的时候 我们注意到 NMOS 由于它的源极和门级之间的导通门限 使 简单构成的 NMOS LDO 它输入和输出之间的压差不可能很小 必须大于这个导通门限 如果 我们引入一个单个的偏置电压对某些应用又是一个负担 因
  • Ag-grid表格 原生javascript的简单使用

    ag grid是支持多种前端框架的企业级表格框架 它能实现的功能也颇多 有兴趣的可以上他的官网api看下ag Grid官网 我这里简单写一下基础的数据初始化生成表格 1 首先引入js文件 我这里用原生的方式 并没有使用vue之类的框架的方法
  • go 进阶 https与http2

    目录 一 复习 https 与 http2 https 是什么 https 原理是什么 http 与https的区别 http2 与http1 x区别 二 golang https http2 基础示例 httputil ReversePr
  • API接口:企业信息核验

    企业信息核验是现代企业管理中必不可少的一项业务 它可以帮助企业做出正确的决策 在这篇文章里 我们将会介绍如何使用API接口来对企业信息进行核验 并实现快捷 准确的查询 一 API接口 在这里我们使用的是挖数据提供的企业信息核验API接口 它
  • opencv-python图形图像处理入门基础知识

    前往老猿Python博文目录 OpenCV 是计算机视觉中经典的专用库 其支持多语言 跨平台 功能强大 OpenCV Python为OpenCV提供了Python接口 使得使用者在Python中能够调用C C 在保证易读性和运行效率的前提下
  • 论在leetcode遇到的奇葩题解

    刷了一上午AcWing 想起来学长说面试更多的还是刷leetcode 于是就打开leetcode官网开始第一次leetcode之旅 当时没考虑太多 直接点进去了 是个中等题 很明显 线性筛嘛 也不难 然后很快就写完 然后我就看到了这个 我敲
  • Mysql数据库的安装教程

    Mysql数据库的安装教程 一 Mysql数据库介绍 二 Mysql数据库特性 1 Mysql现状 2 Mysql的几个特点 三 Mysql数据库中术语介绍 四 检查MySQL 是否安装 1 检测系统是否安装有mysql 五 安装mysql
  • 56-C语言-16进制转10进制

    问题 就是16进制的转10进制 嗯 思路 先手写一下 手推16进制转10进制怎么弄的 写完以后 变成代码 由于之前写过9进制转19进制 因此很多思想一样 这里出现了个新东西 就是10进制以后的进制 出现了字母 因此所输入的数据 变成了字符数
  • C# UDP通讯

    UDP不属于面向连接的通信 在选择协议时 选择UDP必须要谨慎 在网络质量较差情况下 UDP协议数据包丢失会比较严重 但是由于UDP的特性 它不属于连接型协议 具有资源消耗小 处理速度快等优点 所以通常音视频和普通数据在传送时使用UDP较多
  • 【开题报告】ssm电商平台2zag6计算机毕业设计程序

    本项目包含程序 源码 数据库 LW 调试部署环境 文末可获取一份本项目的java源码和数据库参考 开题报告 研究背景 随着互联网技术的迅速发展 电子商务在全球范围内得到了广泛应用和普及 电商平台作为电子商务的重要组成部分 已经成为人们购物的
  • WebStorm修改Tab缩进为2,vue文件也生效,还可以修改webstrom中vue文件回车的4格缩进为2格,亲测可用

    前言 为了 遵循ESLint语法规范 我们需要使用两个空格的tab缩进 使用方法 1 打开设置 找到Code Style 2 找到JavaScript和其他类型 为了vue类型的文件 把数字都改成2 因为vue文件里面有template需要
  • 剑指 Offer 18. 删除链表的节点

    删除链表的节点 思路 先解决特殊条件 package swordPointingToTheOffer public class Eighteen public static class ListNode int val ListNode n
  • XPT2046程序例程(STM32F103C8T6)

    一 前言 本例程是使用XPT2046 AD转换IC采集电位器的数值 并通过串口调试助手打印数据 所使用的是库函数进行编写 二 XPT2046 概述 一 功能说明 XPT2046是一款4线制电阻屏控制器 内含12位分辨率125KHz转换速率逐

随机推荐

  • Review操作系统

    操作系统由什么组成 什么是阻塞IO和非阻塞IO 用户态到内核态怎么切换 中断的原因 进程间的通信方式 同一个机器之间的进程通信哪种最有效 select epllo 2 为什么要分页 你对操作系统内存页有什么了解 为什么要有虚拟内存 有什么用
  • JavaScript学习之ES6学习之Promise

    简介 主要介绍Promise新特性的概念和使用 概念 Promise是ES6引入的异步编程的新解决方案 语法上Promise是一个构造函数 用来封装异步操作 也就是回调函数
  • 面试笔记(四)---怎么去除url地址的参数

    javascript 删除 url 中指定参数 并返回 url 前言 在之前写了一篇博文 javascript 操作 url 中 search 部分方法函数 在这篇博文里面 我们通过写好的函数可以对url中的各种参数进行查询 设置 唯独 忘
  • Android自动调整字体大小的TextView

    文章目录 一 前言 二 设置 TextView 文本自动调整大小 2 1 默认缩放 2 2 按粒度缩放 2 3 按预设定值缩放 三 使用支持库实现文本自动缩放 一 前言 在应用开发过程中 可能需要这样的场景 一个现实区域有限的TextVie
  • 用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part III

    用Cmake build OpenCV后 在VS中查看OpenCV源码的方法 环境VS2022 openCV4 8 0 Part III 用Cmake build OpenCV后 在VS中查看OpenCV源码的方法 环境VS2022 ope
  • python卷积神经网络手写数字识别_TensorFlow.js 卷积神经网络手写数字识别

    源码 demo 调整训练集的大小 观察测试结果的准确性 数据来源 数据来源与 https www kaggle com 中的一道题目 digit recognizer 题目给出42000条训练数据 包含图片和标签 以及28000条测试数据
  • [Python从零到壹] 七.网络爬虫之Requests爬取作者个人博客网站及CSV存储

    欢迎大家来到 Python从零到壹 在这里我将分享约200篇Python系列文章 带大家一起去学习和玩耍 看看Python这个有趣的世界 所有文章都将结合案例 代码和作者的经验讲解 真心想把自己近十年的编程经验分享给大家 希望对您有所帮助
  • PAJ7620U2手势识别——配置手势数据寄存器(6)

    文章目录 前言 一 手势数据寄存器简介 二 配置步骤 1 突发读操作步骤图 2 模块状态转移图绘制 3 模块波形图绘制 4 上板验证 5 参考代码 i2c ctrl 总结 前言 我们已经把所有操作寄存器配置好了 接下来就可以读取手势数据了
  • 把dataframe的一列设为索引

    df set index 列名 inplace True
  • sql语句中左连接left join查询会出现多余重复数据

    在使用左连接查询left join时 有时会出现同等查询条件下单查左表是两条数据 左连接右表后多出两条数据变成4条 根本原因是当左表和右表是1对1关系时 左右表数据匹配 数据条数和左表相同 当左表和右表出现1对多的情况时 左表的一条数据可以
  • Appium的android真机每次启动手机中都会安装Appium settings和Unclock的方法

    一 需要解决的问题 在部分android机型上每次运行最新版的appium desktop都需要安装AppiumSetting以及Unlock 并且安装过程需要用户手动来确认 即使测试机上已经安装了这两个组件 运行appium也会要求安装
  • 每日技巧分享:怎么做视频剪辑

    随着新媒体时代的到来 刷短视频逐渐取代了大家日常的娱乐方式 并且它的种类也非常丰富 有记录生活的vlog 游戏中的精彩瞬间合集 好物测评 亦或是情景短剧等等 但众所周知 呈现在我们眼前的视频是经历过许多道加工程序的 而剪辑就是重中之重 不过
  • 图像分类篇——AlexNet详解

    一 概述 AlexNet是由2012年ImageNet竞赛参赛者Hinton和他的学生Alex Krizhevsky设计的 AlexNet在当年赢得了ImageNet图像分类竞赛的冠军 使得CNN成为图像分类问题的核心算法模型 同时引发了神
  • vue3 excel 导出功能

    1 安装 xlsx 库 npm install xlsx 2 创建导出函数 src utils excelUtils js import as XLSX from xlsx const exportToExcel fileName data
  • 使用AF(三)

    HIHTTPRequestManager h import
  • 卷积神经网络在自然语言处理的应用

    http www csdn net article 2015 11 11 2826192 发 自然语言处理 神经网络 卷积神经网络 图像处理 CNN NLP allowtransparency true frameborder 0 scro
  • [论文阅读] (22)图神经网络及认知推理总结和普及-清华唐杰老师

    娜璋带你读论文 系列主要是督促自己阅读优秀论文及听取学术讲座 并分享给大家 希望您喜欢 由于作者的英文水平和学术能力不高 需要不断提升 所以还请大家批评指正 非常欢迎大家给我留言评论 学术路上期待与您前行 加油 前一篇从个人角度介绍S P2
  • 什么是操作系统的微内核

    文章目录 1 CPU运行的内核模式和用户模式 2 什么是微内核 3 微内核架构 4 微内核的优势 传送门 gt gt AutoSAR实战系列300讲 糖果Autosar 总目录 操作系统用来管理系统资源的 而内核是操作系统的核心部分 它还充
  • mac笔记--csshX failed--compilation aborted at /usr/local/bin/csshX line 1130

    mac笔记 csshX failed compilation aborted at usr local bin csshX line 1130 介绍 操作 说明 介绍 笔者最近将 mac 升级到最新版本 Big Sur 导致 csshX 无
  • SpringBoot执行定时任务

    SpringBoot执行定时任务 1 在启动类中加入 EnableScheduling来开启定时任务 package com example demo import org springframework boot SpringApplic