Spring Task 定时任务

文章目录

  • Spring Task 定时任务
    • pom 包配置
    • 启动类开启定时
    • 创建定时任务实现类
      • 定时任务 1:
      • 定时任务 2:
    • 参数说明
      • fixedRate 说明
      • cron 说明
    • 并行任务

Spring Task 定时任务

在项目开发中,经常需要定时任务来帮助我们来做一些内容,比如定时派息、跑批对账、业务监控等。

实现定时任务有 3 种方式:

  • java 自带的 API:java.util.Timer 类和 java.util.TimerTask 类;

  • Quartz 框架:开源 功能强大 使用起来稍显复杂;

  • Spring 3.0 以后自带了 task 调度工具,也称 Spring Task,它比 Quartz 更加的简单方便。

pom 包配置

pom 包里面只需要引入 SpringBoot Starter 包即可,SpringBoot Starter 包中已经内置了定时的方法。

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

启动类开启定时

在启动类上面加上 @EnableScheduling 即可开启定时:

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

创建定时任务实现类

使用 SpringBoot 自带的定时非常的简单,只需要在方法上面添加 @Scheduled 注解即可。

定时任务 1:

@Component
public class SchedulerTask {private static final Logger log = LoggerFactory.getLogger(SchedulerTask.class);private int count = 0;@Scheduled(cron="*/6 * * * * ?")private void process() {log.info("{}", "this is scheduler task running " + (count++));}
}

设置 process() 每隔六秒执行一次,并统计执行的次数。

我们还有另外的一种方案来设置,固定时间周期执行方法。

定时任务 2:

@Component
public class Scheduler2Task {private static final Logger log = LoggerFactory.getLogger(Scheduler2Task.class);private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");@Scheduled(fixedRate = 6000)public void reportCurrentTime() {log.info("{}", "现在时间:" + dateFormat.format(new Date()));}
}

启动项目之后,就会在控制台看到打印的结果。

结果如下:

INFO [   scheduling-1] com.example.timingtask.Scheduler2Task    : 现在时间:20:12:02
INFO [   scheduling-1] com.example.timingtask.SchedulerTask     : this is scheduler task running 0
INFO [   scheduling-1] com.example.timingtask.Scheduler2Task    : 现在时间:20:12:08
INFO [   scheduling-1] com.example.timingtask.SchedulerTask     : this is scheduler task running 1
INFO [   scheduling-1] com.example.timingtask.Scheduler2Task    : 现在时间:20:12:14
INFO [   scheduling-1] com.example.timingtask.SchedulerTask     : this is scheduler task running 2

说明两个方法都按照固定 6 秒的频率来执行。

参数说明

@Scheduled 参数可以接受两种定时的设置,一种是我们常用的 cron="*/6 * * * * ?",一种是 fixedRate = 6000,两种都可表示固定周期执行定时任务。

fixedRate 说明

  • @Scheduled(fixedRate = 6000) : 上一次开始执行时间点之后 6 秒再执行。
  • @Scheduled(fixedDelay = 6000) : 上一次执行完毕时间点之后 6 秒再执行。
  • @Scheduled(initialDelay=1000, fixedRate=6000) : 第一次延迟 1 秒后执行,之后按 fixedRate 的规则每 6 秒执行一次。

cron 说明

用来配置定时任务的时间表达式,通常用于在Unix/Linux系统中设置定时任务。
在Java应用程序中,Cron表达式也被广泛使用,比如在Quartz调度框架中用来配置定时任务的触发时间。Cron表达式由7个字段组成,分别表示秒、分钟、小时、日期、月份、星期和年(可选)。
每个字段可以包含多个取值,以逗号分隔,或者可以使用通配符和范围来表示时间。以下是Cron表达式的基本格式:plaintext
秒 分 时 日 月 星期 年
其中,各字段的取值范围如下:秒(0-59)、分钟(0-59)、小时(0-23)、日期(1-31)、月份(1-12或者 JAN-DEC)
星期(0-7或者 SUN-SAT,0和7都代表星期日)、年(可选,留空表示每年)。以下是一些常见的Cron表达式示例:
0 0 12 * * ?:每天中午12点触发
0 0/5 * * * ?:每隔5分钟触发
0 0 8-10 * * ?:每天上午8点至10点之间每小时触发
0 0 6,18 * * ?:每天早上6点和晚上6点触发
0 0 9 ? * MON-FRI:周一至周五的早上9点触发

并行任务

了解

之前的的定时任务都是串行执行的。所谓串行执行指的是只由一个线程来执行任务。除了这种方式 Spring Task 还支持并行执行任务,即由多个线程来执行不同的任务。

要实现这样的功能,你需要去进行额外的配置:

@Configuration
@EnableScheduling
public class TimingTaskConfig implements SchedulingConfigurer, AsyncConfigurer {// 线程池线程数量private static final int corePoolSize = 5;@Beanpublic ThreadPoolTaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.initialize(); // 初始化线程池scheduler.setPoolSize(corePoolSize); // 线程池容量return scheduler;}@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.setTaskScheduler(taskScheduler());}@Overridepublic Executor getAsyncExecutor() {return taskScheduler();}@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return null;}
}

注意,这时 @EnableScheduling 注解标注在了这个配置类上,因此,Spring Boot 的入口类上就不再需要标注它了。(当然,你硬要把它标注在入口类上其实也可以)。

其它的相关代码无需修改,运行项目你会看到类似如下的日志输出:

INFO [taskScheduler-1] com.example.timingtask.Scheduler2Task    : 现在时间:20:08:57
INFO [taskScheduler-1] com.example.timingtask.SchedulerTask     : this is scheduler task running 0
INFO [taskScheduler-2] com.example.timingtask.Scheduler2Task    : 现在时间:20:09:03
INFO [taskScheduler-3] com.example.timingtask.SchedulerTask     : this is scheduler task running 1
INFO [taskScheduler-1] com.example.timingtask.Scheduler2Task    : 现在时间:20:09:09
INFO [taskScheduler-4] com.example.timingtask.SchedulerTask     : this is scheduler task running 2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/19976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【并查集】专题练习

题目列表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 模板 836. 合并集合 - AcWing题库 #include<bits/stdc.h> using lllong long; //#define int ll const int N1e510,mod1e97; int n,m; int p[N],sz[N]; int find(int a) {if(p[a]!a) p[a]find(p[a]);return p[a…

第十八讲:联合和枚举

第十八讲&#xff1a;联合和枚举 1.联合体&#xff08;共用体&#xff09;1.1联合体的声明1.2联合体大小的计算1.3联合体的特点1.4联合体的使用1.4.1联合体的直接使用1.4.2联合体直接使用的优化方法1.4.3联合体成员中含有数组的使用1.4.4使用联合体判断当前机器是大端排序&…

K8s(Kubernetes)常用命令

大家好&#xff0c;当谈及容器编排工具时&#xff0c;Kubernetes&#xff08;常简称为K8s&#xff09;无疑是当今最受欢迎和广泛使用的解决方案之一。作为一个开源的容器编排平台&#xff0c;Kubernetes 提供了丰富的功能&#xff0c;可以帮助开发人员和运维团队管理、部署和扩…

电商分析@电商数据与运营优化

电商数据分析与运营优化是指通过对电商平台的各种数据进行深入分析&#xff0c;以发现潜在的问题和机会&#xff0c;并采取相应的优化措施&#xff0c;提高电商运营效率和盈利能力。 首先&#xff0c;电商数据分析需要收集和整理各类数据&#xff0c;包括销售数据、用户数据、流…

大宋咨询(深圳车主满意度调查)如何开展汽车展会观众满意度问卷调查

汽车展览是由政府机构、专业协会或主流媒体等组织,在专业展馆或会场中心进行的汽车产品展示展销会或汽车行业经贸交易会、博览会等活动。汽车展览通过对汽车工艺的呈现与汽车产品的广告,为消费者提供汽车制造工业与汽车产品的发展动向。同时,汽车厂商可通过汽车展览对外宣传产品…

实战16:基于apriori关联挖掘FP-growth算法挖掘关联规则的手机销售分析-代码+数据

直接看视频演示: 基于apriori关联挖掘关联规则的手机销售分析与优化策略 直接看结果: 这是数据展示: 挖掘结果展示: 数据分析展示:

利用WK2168实现串口服务器

ESP32 SPI与WK2168实现串口服务器 概述系统组成代码概述 一些老设备通过RS485采集数据,如果在一个系统中采用几个RS485设备可能是一个不错的选择,但要是使用46个RS485数据采集设备为一个PLC提供外部数据,系统的性能就很难有保障了。通过一个串口服务器实现看来是一个好的选…

智慧校园有哪些特征

随着科技的飞速进步&#xff0c;教育领域正经历着一场深刻的变革。智慧校园&#xff0c;作为这场变革的前沿代表&#xff0c;正在逐步重塑我们的教育理念和实践方式。它不仅仅是一个概念&#xff0c;而是一个集成了物联网、大数据、人工智能等先进技术的综合生态系统&#xff0…

SpringBoot源码(自动装配、内嵌Tomcat)

文章目录 依赖管理pom依赖管理Web依赖自定义starter 一、WebMvcAutoConfiguration1.1 Filter1.2 Interceptor 二、源码解析2.1 SpringApplication2.1.1 构造方法1、填充webApplicationType2、自动装配Initializers3、自动装配Listeners 2.1.2 run(args) 2.2 SpringApplicationR…

手写Mitt实现事件订阅、发布和取消订阅

Mitt类设计 emitter属性&#xff1a;用于存储事件和对应的处理器 on方法&#xff1a;订阅事件 off方法&#xff1a;取消订阅事件 emit方法&#xff1a;触发事件 export class Mitt<T> {private readonly emitter: Record<string, Array<(value: T[keyof T]) …

AI边缘计算盒子在智慧交通的应用

方案背景 随着经济增长&#xff0c;交通出行需求大幅增长&#xff0c;但道路建设增长缓慢&#xff0c;交通供需矛盾日益显著&#xff0c;中心城区主要道路高峰时段交通拥堵严重&#xff0c;道路交通拥堵逐渐常态化&#xff0c;成为制约城市可持续发展的重要因素之一。 痛点问题…

web 前端开发技术---网页的制作

这是一个网页代码 上年包含了电子邮件&#xff0c;选项建 等等 分享给大家 <!-- prj_7_1.html --> <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><title>留言板设计</title><style type&…

【C++】入门(一):命名空间、缺省参数、函数重载

目录 一、关键字 二、命名空间 问题引入(问题代码)&#xff1a; 域的问题 1.::域作用限定符 的 用法&#xff1a; 2.域的分类 3.编译器的搜索原则 命名空间的定义 命名空间的使用 举个&#x1f330;栗子&#xff1a; 1.作用域限定符指定命名空间名称 2. using 引入…

【数据结构与算法 | 堆篇】JAVA实现小顶堆

1. 堆的特点 堆的逻辑结构是数组&#xff0c;内存结构是完全二叉树.完全二叉树即只有最后一层才有叶子节点.堆又分为大顶堆与小顶堆. 大顶堆的特点是 : 父亲节点比孩子节点的都要大. 小顶堆的特点与其相反.Java的优先级队列(PriorityQueue)的底层实现即用到了小顶堆. 所以下文…

K210视觉识别模块学习笔记3:内存卡写入拍摄图片_LED三色灯的操作_按键操作_定时器的配置使用

今日开始学习K210视觉识别模块: LED三色灯的操作_按键操作_定时器的配置使用_内存卡写入拍摄图片 亚博智能的K210视觉识别模块...... 本文最终目的是编写一个按键拍照的例程序&#xff1a; 为以后的专用场景的模型训练做准备&#xff0c;因为训练自己的模型需要大量的图片&a…

jmeter基础入门练习题

jmeter存在A,B两个线程组的情况下&#xff0c;默认设置下&#xff0c;运行顺序是&#xff1a;A A&#xff1a;A,B同时运行 B&#xff1a;先运行A&#xff0c;在运行B C&#xff1a;先运行A&#xff0c;等待2s运行B D:先A运行完&#xff0c;等待默认设置时间后运行B 下列说法正…

编译安装PHP服务(LAMP3)

目录 1.初始化设置&#xff0c;将安装PHP所需软件包传到/opt目录下 &#xff08;1&#xff09;关闭防火墙 &#xff08;2&#xff09;上传软件包到/opt目录 2.安装GD库和GD库关联程序&#xff0c;用来处理和生成图片 3.配置软件模块 4.编译及安装 5.优化把PHP 的可执行程…

nginx的安装001

Nginx是一款高性能的HTTP和反向代理服务器&#xff0c;以及邮件代理服务器&#xff0c;由 Igor Sysoev 开发并公开发布于2004年。Nginx以其高并发处理能力、低内存消耗和稳定性著称&#xff0c;特别适合部署在高流量的网站上。 操作系统&#xff1a; CentOS Stream 9 安装步骤…

【算法训练 day44 分割等和子集】

目录 一、分割等和子集-LeetCode 416思路实现代码1.二维dp代码2.一维dp代码 问题总结 一、分割等和子集-LeetCode 416 Leecode链接: leetcode 416 文章链接: 代码随想录 视频链接: B站 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&…

SQL入门教程,很详细

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系数据库的标准语言。它被广泛用于存储、操作和检索数据。在这篇文章中&#xff0c;我们将介绍SQL的基本概念和常用命令。 首先&#xff0c;我们需要了解SQL的基本结构。SQL语句通常由以下几个部分组成&…