定时任务在实际开发中有着广泛的用途,本文主要帮助你构建定时任务的知识体系,同时展示Timer 的schedule和scheduleAtFixedRate例子;后续的文章中我们将逐一介绍其它常见的与SpringBoot的集成。

知识准备

需要对定时任务的使用场景和常见的实现方式。

什么样的场景会使用定时任务?

比如每天/每周/每月生成日志汇总,定时发送推送信息,定时生成数据表格等

定时任务有哪些实现方式?

首先你需要构建如下实现定时任务的知识体系。在后续的文章中我们将逐一介绍在SpringBoot下的集成。

  • 定时任务基础
    • Cron表达式
    • Linux定时任务工具crontb
  • JDK内置
    • Timer
    • ScheduleExecutorService
  • Netty
    • HashedWheelTimer
  • Spring
    • Spring自带Schedule
    • Spring集成Quartz
  • 分布式集群
    • Quartz持久化JDBC方式
    • Elastic-job
    • xxl-job

Timer实现案例

Timer 的schedule和scheduleAtFixedRate例子如下。

schedule延迟任务

执行定时任务,延迟1秒开始执行。

@SneakyThrows
public static void timer() {// start timerTimer timer = new Timer();timer.schedule(new TimerTask() {public void run() {log.info("timer-task @{}", LocalDateTime.now());}}, 1000);// waiting to process(sleep to mock)Thread.sleep(3000);// stop timertimer.cancel();
}

输出

10:05:47.440 [Timer-0] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-task @2021-10-01T20:05:47.436

schedule周期任务

延迟0.5秒开始执行,每秒执行一次, 10秒后停止。

@SneakyThrows
public static void timerPeriod() {// start timerTimer timer = new Timer();timer.schedule(new TimerTask() {@SneakyThrowspublic void run() {log.info("timer-period-task @{}", LocalDateTime.now());Thread.sleep(100); // 可以设置的执行时间, 来测试当执行时间大于执行周期时任务执行的变化 }}, 500, 1000);// waiting to process(sleep to mock)Thread.sleep(10000);// stop timertimer.cancel();
}

输出

10:05:49.781 [Timer-1] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-period-task @2021-10-01T10:05:49.781
10:05:50.781 [Timer-1] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-period-task @2021-10-01T10:05:50.781
10:05:51.781 [Timer-1] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-period-task @2021-10-01T10:05:51.781
10:05:52.781 [Timer-1] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-period-task @2021-10-01T10:05:52.781
10:05:53.782 [Timer-1] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-period-task @2021-10-01T10:05:53.782
10:05:54.783 [Timer-1] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-period-task @2021-10-01T10:05:54.783
10:05:55.783 [Timer-1] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-period-task @2021-10-01T10:05:55.783
10:05:56.784 [Timer-1] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-period-task @2021-10-01T10:05:56.784
10:05:57.785 [Timer-1] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-period-task @2021-10-01T10:05:57.785
10:05:58.786 [Timer-1] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-period-task @2021-10-01T10:05:58.786

scheduleAtFixedRate

延迟0.5秒开始执行,每秒执行一次, 10秒后停止。

同时测试某次任务执行时间大于周期时间的变化。

@SneakyThrows
public static void timerFixedRate() {// start timerTimer timer = new Timer();timer.scheduleAtFixedRate(new TimerTask() {int count = 0;@SneakyThrowspublic void run() {if (count++==2) {Thread.sleep(5000); // 某一次执行时间超过了period(执行周期)}log.info("timer-fixedRate-task @{}", LocalDateTime.now());}}, 500, 1000);// waiting to process(sleep to mock)Thread.sleep(10000);// stop timertimer.cancel();
}

输出

10:05:59.781 [Timer-2] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-fixedRate-task @2021-10-01T10:05:59.781
10:06:00.782 [Timer-2] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-fixedRate-task @2021-10-01T10:06:00.782
10:06:06.783 [Timer-2] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-fixedRate-task @2021-10-01T10:06:06.783
10:06:06.783 [Timer-2] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-fixedRate-task @2021-10-01T10:06:06.783
10:06:06.783 [Timer-2] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-fixedRate-task @2021-10-01T10:06:06.783
10:06:06.783 [Timer-2] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-fixedRate-task @2021-10-01T10:06:06.783
10:06:06.783 [Timer-2] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-fixedRate-task @2021-10-01T10:06:06.783
10:06:06.783 [Timer-2] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-fixedRate-task @2021-10-01T10:06:06.783
10:06:07.781 [Timer-2] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-fixedRate-task @2021-10-01T10:06:07.781
10:06:08.781 [Timer-2] INFO tech.aizer.springboot.schedule.timer.timertest.TimerTester - timer-fixedRate-task @2021-10-01T10:06:08.781

(你会发现周期执行1秒中执行一次,但是某次执行了5秒,这时候,后续的任务会加快执行进度,一次性就执行了,执行的时间都是10:06:06.783, 所以scheduleAtFixedRate最大的特点是保证了总时间段内的执行次数

进一步理解

我们再通过一些问题来帮助你更深入理解Timer实现方式。

schedule 和 scheduleAtFixedRate 有何区别?

  • schedule:每次执行完当前任务后,然后间隔一个period的时间再执行下一个任务; 当某个任务执行周期大于时间间隔时,依然按照间隔时间执行下个任务,即它保证了任务之间执行的间隔
  • scheduleAtFixedRate:每次执行时间为上一次任务开始起向后推一个period间隔,也就是说下次执行时间相对于上一次任务开始的时间点;按照上述的例子,它保证了总时间段内的任务的执行次数

为什么几乎很少使用Timer这种方式?

Timer底层是使用一个单线来实现多个Timer任务处理的,所有任务都是由同一个线程来调度,所有任务都是串行执行,意味着同一时间只能有一个任务得到执行,而前一个任务的延迟或者异常会影响到之后的任务。

如果有一个定时任务在运行时,产生未处理的异常,那么当前这个线程就会停止,那么所有的定时任务都会停止,受到影响。

PS:在这点上你可以看到,定时任务Job中异常超时等一般都是要自行处理的,以防止对其它任务的影响。

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

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

相关文章

系统分析师学习笔记

系统分析师学习笔记 目录 系统分析师学习笔记前言1 数学与工程基础(选择题2-4分)1.1 图论与应用(考选择题)1.1.1 最小生成树1.1.2 最短路径1.1.3 网络与最大流量(常考) 1.2 预测与决策(在原有基…

《仿盒马》app开发技术分享-- 逻辑优化第三弹(83)

技术栈 Appgallery connect 开发准备 现在我们的app功能已经趋近完善,bug和缺失的细节也越来越少了,我们继续对app进行优化,首先是我们的积分页面,我们只实现了全部的积分展示内容,对收入和支出的积分明细并没有进行…

(七)Dockerfile文件20个命令大全详解

目录 1. FROM 基于基础镜像构建 1.1 FROM 指令开头 1.2 ARG和FROM使用 1.3 FROM可以多个 1.4 AS name 1.5 tag和digest 2. RUN 执行任何命令 2.1 shell和exec两种使用方式 2.2 [OPTIONS]参数 3. CMD 指定默认执行命令 3.1 使用格式shell和exec两种使用方式 3.2 只…

攻防世界-MISC-4-2

知识点 1.字频分析 步骤 下载附件是一段文本, 在线网站处理:quipqiup - cryptoquip and cryptogram solver flag{classical-cipher_is_not_security_hs}

Nordic nRF54L15 SoC对包含电池监测、中断处理和电源轨控制的定制 nPM1300 示例

1:以下是适用于 nRF Connect SDK (NCS) 的基于 Zephyr 的示例应用程序,展示了: 读取电池电压和状态处理来自 nPM1300 的中断(例如,电池或电源轨事件)控制电源轨(通过 GPIO 启用/禁用&#xff0…

MySQL 单机部署

文章目录 1、准备阶段1.1、部署规划1.2、硬件准备1.3、软件准备1.4、环境清理 2、实施阶段2.1、操作系统实施2.2、数据库部署实施 3、完成 1、准备阶段 1.1、部署规划 本次部署用于测试环境,单机模式,不需要主备;MySQL数据库版本要MySQL5.7…

小程序学习笔记:实现上拉触底加载随机颜色案例全解析

在前端开发中,上拉触底加载数据是一个常见的交互需求。今天,我们就来详细探讨如何实现一个上拉触底加载随机颜色的案例,帮助大家更好地理解相关技术的应用。 案例效果展示 在这个案例里,我们最终要实现的效果是这样的&#xff1…

Java+GcExcel,生成自定义工作表

引言 在当今数字化办公和数据处理的时代,电子表格的应用无处不在。对于 Java 开发人员来说,如何高效地创建、操作和处理兼容 Microsoft Excel 的电子表格是一个常见的需求。GcExcel Java 作为葡萄城表格解决方案中的后端表格组件,为 Java 开…

跨平台C++软件开发之基本数据类型介绍

跨平台C软件开发过程中,原生数据类型的字节宽度差异是一个常见且关键的问题,不同操作系统、编译器、硬件架构可能会为相同的数据类型分配不同的字节数,这可能导致代码在移植过程中出现未定义的行为或兼容性问题。本文简要介绍C原生数据类型字…

Java编程中的单例模式

在Java中实现单例模式有几种方式,但最常见的是懒汉式和饿汉式。我们先来看一个简单的懒汉式实现: public class Singleton {private static Singleton instance;private Singleton() {} // 构造方法私有化,防止外部实例化public static Sin…

原生微信小程序网络请求与上传接口封装实战指南

本文基于微信小程序原生 API,封装 request 和 uploadFile 接口,最终实现统一请求管理、请求拦截、错误处理等能力。 📦 一、为什么要封装网络请求? 微信小程序提供了 wx.request 和 wx.uploadFile 原生 API,但直接使用…

软件测试基础知识详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、软件测试定义 软件测试是指在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行…

Spring Boot 文件上传大小配置错误解决方案

问题描述 在Spring Boot应用中出现以下错误: Failed to bind properties under spring.servlet.multipart.max-file-size’ to org.springframework.util.unit.Datasize Property:spring.servlet.multipart.max-file-sizeValue: 10Mb Origin: URL [file:./applicat…

Matplotlib绘制矩阵图,plt.matshow/imshow 与 ax.pcolor(pcolormesh)方法的使用

文章目录 plt.matshow离散colorbar连续colorbar ax.pcolor简单应用综合应用 import matplotlib.pyplot as plt import numpy as np from matplotlib.colors import ListedColormap#data np.random.seed(42) data np.random.rand(4, 4)plt.matshow 可以把下面的matshow换成ims…

关于 ARM64 汇编:调用流程与栈帧结构解析

一、ARM64 函数调用分析(汇编级) 寄存器规则(AArch64 ABI) 用途寄存器参数传递x0 ~ x7返回值x0(最多两个:x0、x1)栈指针sp链接寄存器x30(lr)帧指针x29(fp&a…

Kafka vs RabbitMQ vs Redis:消息中间件全面对比与选型指南

Kafka vs RabbitMQ vs Redis:消息中间件全面对比与选型指南 一、各中间件消息流转全过程Kafka 消息流转全过程(含机制详解)1. 核心组件2. 流程详解 RabbitMQ 消息流转全过程(含机制详解)1. 核心组件2. 流程详解 Redis …

【代码级指南】从Zero-shot到Chain-of-Thought:Prompt工程全栈技术解析​

本文较长,建议点赞收藏,以免遗失。 从理论到实践,掌握Zero-shot/Few-shot Prompt设计精髓。 一、Prompt Engineering 核心概念图解 Prompt Engineering 三大支柱 二、Prompt 设计基础框架 1. Prompt 核心四要素 prompt_template "&q…

sizeof()函数无法计算形参指针指向的字符串大小

给定的代码中&#xff0c;func() 函数打印的 name_len 是 指针的大小&#xff0c;而不是字符串的长度。具体原因如下&#xff1a; 代码分析 #include <stdio.h> #include <string.h>void func(char *name) {printf("name_len:%d", sizeof(name)); // 打…

Python打卡:Day37

知识点回顾&#xff1a; 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 浙大疏锦行

Android 9.0(API 28)后字重设置

在 Android 应用中设置字体字重&#xff08;Font Weight&#xff09;可以通过多种方式实现&#xff0c;下面详细介绍各种方法及其适用场景。 1. 使用 XML 属性设置字重 1.1 基本字重设置&#xff08;API 1&#xff09; <TextViewandroid:layout_width"wrap_content&…