在springboot项目中实现一个定时任务执行的功能

SpringBoot如何实现动态的定时任务 SpringBoot实现动态的定时任务一、介绍二、依赖三、定时任务配置类ScheduledConfig原理完整的配置类代码四、定时任务类五、JPA六、实体类七、yml配置文件八、主启动类九、启动测试缺点 一、介绍 SpringBoot项目中,创建定时任务除了使用@Scheduled 注解外,还可以使用 SchedulingConfigurer。 @Schedule 注解有一个缺点,其定时的时间不能动态的改变,而基于 SchedulingConfigurer 接口的方式可以做到动态的定时任务。 二、依赖 因为 阅读详情

前言

  这篇文章教大家在springboot项目中实现一个定时任务执行的功能,并且该定时任务要具备服务重启后也能执行的能力,本文会详细分析思路,并提供完整实现代码。

思路

  定时任务线程我们使用TimerTask实现。实现思路是写一个接口接收客户端传过来的任务执行时间等参数,然后接口使用TimerTask根据接收到的执行时间参数创建定时任务,并持久化该次任务的任务ID以及执行时间,然后用CommandLineRunner写一个服务启动时执行的任务线程去查询还未执行的定时任务,并使用TimerTask将任务线程重新生成,这样就可以实现服务重启后原定的定时任务也能到点执行。

代码实现

待执行定时任务实体类

import lombok.Data;

@Data
public class CampaignRecordEntity {
    private Long id;

    private String pushTime;

    private Long campaignId;

    private String type;

    private String proxy;
}

接收执行时间参数并持久化待执行任务

// todo 下面这里要记录本次任务的参数内容,并为本次任务请求生成一个任务ID 这里假设任务ID 001
String pushTime = "2024-09-29 18:00:00";// 参数传入的任务执行时刻
String taskId = "001";
Timer timer = new Timer(uuid);
TimerTask task = new TimerTask() {
    @Override
    public void run() {
        try {
        	// todo 下面可以写你待执行任务需要执行的具体内容
        	// 执行完要删除掉任务记录,以免每次重启都查询到任务记录并生成不必要的任务线程
            int deleteRecordNum = browserPushMsgMapper.deleteCampaignRecordByCampaignId(taskId );
            if (deleteRecordNum > 0) {
                log.info("delete campaign record success.");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
};
timer.schedule(task, DateUtils.StringToDate(pushTime, "yyyy-MM-dd HH:mm:ss"));
uuidTimerTaskContainer.put(uuid, task);
CampaignRecordEntity entity = new CampaignRecordEntity();
entity.setCampaignId(e.getId());
entity.setPushTime(pushTime);
int num = mapper.insertCampaignRecord(entity, "Remo");
if (num > 0) {
    log.info("insert campaign record success.");
}

服务启动时待执行任务查询生成

  由于服务重启会导致重启前生成的任务线程被杀死,因此重启后需要重新生成任务线程:

@Slf4j
@Component
@Order(100)
public class SendMsgStartTask implements CommandLineRunner {
    @Resource
    private Mapper mapper;
    
    @Override
    public void run(String... args) throws Exception {
        List<CampaignRecordEntity> records = browserPushMsgMapper.queryCampaignRecords();
        if (records != null && records.size() > 0) {
            for (CampaignRecordEntity entity : records) {
                try {
                    Timer timer = new Timer(UuidUtils.getUuidString(20));
                    String taskId = entity.getId();
                    TimerTask task = new TimerTask() {
                        @Override
                        public void run() {
                           	// todo 执行到执行时刻需要执行的内容
                           	// 执行完后要清楚待执行任务
                            int deleteRecordNum = mapper.deleteCampaignRecordByCampaignId(taskId);
                            if (deleteRecordNum > 0) {
                                log.info("delete campaign record success.");
                            }
                        }
                    };
                    timer.schedule(task, DateUtils.StringToDate(DateUtils.millisecondToDate(recordVo.getTime(), "yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss"));
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
}
SpringBoot实现动态定时任务 项目情况:         在当前项目中需要一个定时任务来清除过期的校验码,如果使用数据库存储过程的话不方便维护。因此采用SpringBoot自带的方式来设置定时任务。技术说明:         SpringBoot自带的方式有两种可以实现:        一种是使用@Scheduled注解的方式,只需要在启动类或者它所在的类上添加@EnableScheduling注解允许执行定时任务,并且设置S... 阅读详情

相关推荐

快速了解Spyder

一 面板介绍菜单栏:放置所有功能工具栏:放置快捷菜单,可以通过菜单栏中的View的Toolbars的复选框来勾选工作区:写代码的地方属性页的标题栏:可以显示当前代码的名字和位置查看栏:查看文件、调试时的对象及变量输出栏:查看程序的输出信息,也可以作为shell终端来输入Python语句状态栏:用来显示当前文件权限、编码,光标指向位置和系统内存二 注释功能注释功能为编写代码很常用功能,下面介绍Spy...

实践求真知 1万+

SpringBoot动态定时任务--利用hutool工具类实现

思路:首先是能够获取任务具体执行的类名,然后将任务类名以及cron表达式新增到数据库保存起来,有一个监听类,根据任务类名和cron表达式用来运行该定时任务。

java知识整理 4775

海康视觉平台VisionMaster实战入门:从通讯配置到工具应用

本文为海康VisionMaster视觉平台实战入门指南,详细介绍了从软件安装准备、与PLC等外部设备的通讯配置,到匹配定位、测量、畸变矫正等核心工具的应用方法。通过实战案例拆解,帮助工程师快速掌握如何搭建完整的机器视觉检测与引导定位系统,实现工业自动化项目落地。

weixin_29224309的博客 1006

Timer和TimerTask详解

以下内容根据 The JavaTM Tutorial 和相关API doc翻译整理,以供日后参考:1.概览Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。简单的一个例程:import java.util.Timer;import java.util

ahxu的专栏 15万+

蓝桥杯算法:打印图形——六芒星

【输入格式】 输入一行包含一个整数 n。 【输出格式】 输出一个六芒星,表示满足题意的图形。 【样例输入】 3 4 【样例输出】 【评测用例规模与约定】 对于所有评测用例,1 ≤ n ≤ 20。 总结: 第一次做图形题,做了蛮久,图形题有很多的方式去完成,它考验的是你能不能找到更简单的那一种方式. 我初看到这个图形,第一种想法是把这个六芒星当做六个小三角形来做,然后以某种规则排列一下,就能做出来,但是尝试了一下感觉太麻烦了。 然后我的第二种想法是,这个图形是对称图形,怎么能写出一半吗? 这样另一半想办

KeepCodeing 3835

电子纸价签实战:基于SSD1680的墨水屏驱动开发与优化

本文详细介绍了基于SSD1680驱动芯片的电子纸价签开发实战,涵盖硬件连接、驱动框架搭建、核心流程解析及性能优化。重点剖析了初始化配置、波形文件加载、图像数据写入与刷新触发等关键步骤,并提供了功耗优化、显示效果提升及代码健壮性等实用避坑指南,帮助开发者高效实现稳定低功耗的墨水屏驱动。

weixin_28278377的博客 225

Timer和TimerTask线程定时器用法

Timer和TimerTask线程定时器用法// 线程Timer Timer timer = new Timer(); timer.schedule(new TimerTask() {//要执行的任务 @Override public void run() { System.out.println("复习java基础"); } }, 1000, //执行的时间

仨胖的博客 442

01 - 什么是SVM

摘要:SVM(共享虚拟内存)技术使CPU和GPU能共享同一虚拟地址空间,简化异构计算编程。传统模型需手动管理CPU/GPU内存和拷贝数据,而SVM允许直接传递指针,自动处理页面迁移和一致性维护。其核心包括统一地址空间、按需迁移、页面故障处理和一致性管理,显著降低编程复杂度并提升性能。通过HMM框架、MMU通知和GPU页面异常等机制实现高效内存共享,支持复杂数据结构,为异构计算带来便利。

图形/计算GPU的驱动与虚拟化技术分享园地 3118

浅谈传统定时任务和分布式定时任务

为什么用定时任务? 定时任务平台可以在后台自动检测数据并进行操作。主要应用在订单状态改变、后台统计、定时发送邮件或短信等。 定时任务怎么部署实现? 传统的定时任务可以通过可定时线程池、timertask、quartz、spring-schedule方式来进行处理。他们的依赖和代码如下面所示。 maven依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spri

qq_27087671的博客 1796

渗透测试工具之Sliver

攻击者需要将生成的植入物传输到目标系统,并执行它。C2 框架的架构与 Metasploit(如 Meterpreter)类似,但更专注于。(Red Teaming)中常见的攻击工具之一,攻击者利用 C2 服务器。组成,二者共同实现 C2 服务器与受控设备的通信。植入物(Implants)是 Sliver 生成的。抓包分析时,可以看到所有数据都是加密传输的。和**监听器(Listeners)**功能。Sliver 支持多种通信协议,如。随着安全防御的不断提升,企业应加强。进行通信,数据仍然是加密的。

idlecloud0105的博客 1934

海思芯片OpenHarmony系统移植:Sensor传感器模块HDF驱动配置HCS文件详解

海思系列芯片的传感器模块通过HDF(Hardware Driver Foundation)驱动框架进行管理和配置。传感器HCS(HDF Configuration Source)配置文件定义了各类传感器的硬件参数、总线配置、寄存器序列等信息,为传感器驱动提供必要的初始化和运行参数。海思系列芯片适配OpenHarmony的传感器HDF配置HCS文件是传感器驱动开发的关键部分,通过合理配置可以实现各种传感器设备的驱动支持。

m0_67505153的博客 208

SpringBoot中定时任务的实现,@Scheduled 注解详解

通过`@Scheduled`注解,Spring Boot提供了一种简单且强大的方式来实现定时任务。背后的核心机制包括注解处理器、任务调度器和任务触发器。这些组件协同工作,确保定时任务能够按照预定的时间规则准确执行。希望这些信息能帮助你更好地理解和使用Spring Boot中的定时任务功能。

横竖撇折点 1825

Spark中Application、Job、Stage和Task区别详解

在Spark中,有一些关键的概念,如Application、Job、Stage和Task,它们描述了Spark作业的不同层次和组成部分。下面我将详细介绍每个概念,并通过示例说明它们之间的区别。

优快云 精品推荐 901

SpringBoot配置定时任务

SpringBoot配置定时任务 1、在启动类上加注解开启定时任务 package com.lcl.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springf...

码 9704

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【推广】推荐一个我的开源项目——分布式动态定时任务

该定时任务是基于springboot的scheduling做的分布式动态定时任务,其功能包括添加定时任务、编辑定时任务、删除定时任务、启动定时任务、关闭定时任务、查看定时执行情况、查看错误日志。目前只提供了后端以及相关的管理接口。

✈ 正在努力 の 寒江(StudiousTiger) ✌ 呐 ✈ 282

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

springboot 计划任务 定时任务 console

为什么80%的码农都做不了架构师?>>> ...

weixin_33834075的博客 145

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

spring boot项目中Schedule定时任务

1.首先在spring boot的入口类Application.java中添加注解@EnableScheduling,允许支持schedule2.建一个类执行定时任务package tz.lion.config;import java.math.BigDecimal;import org.springframework.beans.factory.annotation.Autowired;impo...

lichao_wan的博客 495

SpringBoot定时任务的设置

如果我们需要每天定时进行财务汇总,我们的服务器就需要开启线程定时触发,SpringBoot中开启定时任务依然是使用注解。 一、首先在Application中添加注解 @EnableScheduling 二、写一个定时任务的类,使用注解设置类和方法即可 @Component public class StartManager { @Scheduled(fixedDelay = 1

宝华的小岛 651

SpringBoot开启定时任务

SpringBoot自带的定时任务

weixin_53998054的博客 1593

直播系统开发,springboot指定时间触发定时任务

以上就是 直播系统开发,springboot指定时间触发定时任务,更多内容欢迎关注之后的文章。直播系统开发,springboot指定时间触发定时任务。注意:此类只是测试一下,如果项目中是不需要此类的。创建项目启动后进行配置具体时间执行定时类。新建测试Demo类执行定时任务。

云豹网络科技 224

Spring Boot:在Spring Boot中使用定时任务

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33738982的博客 85

Springboot中上一个定时任务没执行完,是否会影响下一个定时任务执行分析及结论

本文将用测试代码验证:定时任务阻塞问题。 在springboot中使用定时任务的步骤 在启动类上加上注解:@EnableScheduling,表示允许定时任务执行 定时任务需要在类上加上@Component或者其衍生类(Controller、Service等),用于纳入Spring容器管理。 在需要定时任务方法上增加注解@Scheduled,注解的参数是定时任务执行时机 首先需要知道:定时任务默认是单线程的。,所以默认情况下,上一个定时任务没有执行完,下一个定时任务是不会开始的。 单线程定时

乙壳虫的博客 2万+

SpringBoot 如何执行定时任务

SpringBoot 如何执行定时任务 工作中有需要应用到定时任务的场景,一天一次,一周一次,一月一次,一年一次,做日报,周报,月报,年报的统计,以及信息提醒,等,spring boot 提供了一个两种方式实现定时任务。 一、静态定时任务—基于注解 SpringBoot 中的 @Scheduled 注解为定时任务提供了一种很简单的实现,只需要在注解中加上一些属性,例如 fixedRate、fixedDelay、cron(最常用)等等,并且在启动类上面加上 @EnableScheduling 注解,就可

花开半夏 · 流年似水 9907

SpringBoot三种方式实现定时任务

SpringBoot三种方式实现定时任务 定时任务实现的三种方式: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。 ScheduledExecutorService:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都...

longzhongxiaoniao的博客 4万+

Java 实现 Springboot 定时任务(每隔一段时间自动执行一次)

Java非Web的springboot实现定时器(每3秒执行一次)前言一、新建Java Springboot项目二、示例代码运行效果总结 前言 运行非Web的Springboot项目时,会发现启动主类后马上就会停止,普通的Timer定时器无法达到定时自动执行Springboot项目的效果,下面我们用Springboot自带的注解(@Component、@Scheduled、@EnableScheduling)来进行定时任务。 一、新建Java Springboot项目 选择Spring Initializ

泡泡的博客 2万+
上一篇: 详解调用钉钉AI助理消息API发送钉钉消息卡片给指定单聊用户
下一篇: 回顾自己大四找工作的时期,那时真的很迷茫
知了蝉
博客等级 码龄10年 350粉丝 43原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知了蝉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值