springboot2与定时任务的那点事

SpringBoot整合定时任务和异步任务(SpringBoot 系列-五) SpringBoot整合定时任务和异步任务 一、SpringBoot定时任务schedule概述 定时任务方案: 1.Java自带的java.util.Timer类 timer:配置比较麻烦,时间延后问题 timertask:不推荐 2、Quartz框架 配置更简单 xml或者注解 3、SpringBoot使用注解方式开启定时任务 ... 阅读详情

定时任务,顾名思义就是把任务定在某个时间点去做,可能是一次执行,也可能是循环往复,无论是那种形式,在如今都是非常的简单。

在Java中,Executors中的newSingleThreadScheduledExecutor(),以及Timer都可以实现定时功能,但是它们只能实现一些简单的定时任务,如果我们想实现类似cron表达式的复杂定时任务,它们就显得有些力不从心了。SpringBoot针对定时任务做了很好的封装,我们只需要进行简单的配置就可以实现。

简单的定时任务

SpringBoot实现一个简单的定时任务只需要两步,如下所示:

第一步,启动类上加上@EnableScheduling注解,

@SpringBootApplication(scanBasePackages = {"com.fanqie.springboot2"})
@EnableScheduling //表示开启定时任务
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

第二步:编写定时任务类,大家记得@Component注解一定要加上,我遇到身边的同事就是因为大意,没有加上该注解,导致SpringBoot不能扫描到该类,定时任务没有执行。

@Component
public class SimpleScheduler {
    /**
     * 每10秒执行一次定时任务
     */
    @Scheduled(cron = "*/10 * * * * ?")
    public void firstTask() {
        System.out.println("当前时间:" + LocalDateTime.now());
    }
}

到这里,我们就实现了一个简单的定时任务。@EnableScheduling 和@Scheduled,利用cron表达式,就可以实现各种复杂的定时任务。大家是不是觉得非常简单呢?是的,就是这么简单,利用SpringBoot提供的定时任务,我们就可以实现大部分的业务,不需要去额外配置quartz来完成,@Scheduled里面还包含了许多其它的参数,例如:fixedDelay(上一次任务执行完成后,再等待fixedDelay时长后,执行下一次任务)、fixedRate(任务执行时开始计时,若任务运行时长>fixedRate,下一次任务在上一次任务执行完成后立即执行)、initialDelay(初始化等待时间),为了防止篇幅过长,这里我就不写示例了,大家可以自行尝试一下。

现在可以完成大部分的业务需求了,但是现在,我们有这样的一个需求:在web端显示定时任务列表,并且可以实现定时任务的开启和关闭。大家思考两分钟...

定时任务的开启和关闭

大家可以发现,通过@EnableScheduling 和@Scheduled实现的定时任务,参数都是预先定义好的,而且我们不能控制它们的开启和关闭,当程序运行的时候,它们就已经启动了。我们不可能在开启的时候就把程序运行,关闭的时候就把程序杀掉吧,这样会让同行笑掉大牙的,而且还可能出现数据不一致的现象。

其实在SpringBoot中,ThreadPoolTaskScheduler就已经很好的集成了该功能,只需要我们写一些简单的代码,就可以实现自我控制,如何实现呢?请往下看:

第一步:ThreadPoolTaskScheduler配置,

@Configuration
public class SchedulerConfig {
    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setThreadFactory(r -> new Thread(r, "定时任务"));
        return threadPoolTaskScheduler;
    }
}

第二步:编写定时任务接口,这里为了演示方便,就不写web页面了,直接使用Swagger和List进行测试(正式项目中,直接替换为数据库或其它方式),

@RestController
@Api(tags = "定时任务模块")
@RequestMapping("/scheduler")
public class SchedulerController {
    private final ThreadPoolTaskScheduler threadPoolTaskScheduler;
    private List<SchedulerPO> list = new ArrayList<>();

    /**
     * 默认启动一个定时任务
     *
     * @param threadPoolTaskScheduler threadPoolTaskScheduler
     */
    @Autowired
    public SchedulerController(ThreadPoolTaskScheduler threadPoolTaskScheduler) {
        this.threadPoolTaskScheduler = threadPoolTaskScheduler;
        //schedule有两个参数,Runnable task, Trigger trigger,task代表执行任务,trigger代表触发器
        String time = "*/10 * * * * ?";
        ScheduledFuture<?> future1 = this.threadPoolTaskScheduler.schedule(() -> {
            Thread thread = Thread.currentThread();
            System.out.println(thread.getName() + thread.getId() + ": 我还在活着");
        }, new CronTrigger(time));
        //保存到集合中,
        SchedulerPO schedulerPO = new SchedulerPO(1, "我是定时任务一", "创建", future1, time);
        list.add(schedulerPO);
    }


    @ApiOperation(value = "关闭定时任务", notes = "关闭定时任务")
    @PutMapping("/{id}/cancel")
    public void cancelById(@PathVariable int id) {
        list.forEach(schedulerPO -> {
            if (schedulerPO.getId() == id) {
                ScheduledFuture future = schedulerPO.getScheduledFuture();
                if (future != null) {
                    future.cancel(true);
                }
            }
        });
    }

    @ApiOperation(value = "查询所有定时任务", notes = "查询所有定时任务")
    @GetMapping("/all")
    public List all() {
        return list;
    }

    @ApiOperation(value = "添加定时任务", notes = "添加定时任务")
    @PostMapping("/add")
    public List add(@RequestBody SchedulerPO schedulerPO) {
        ScheduledFuture<?> future = this.threadPoolTaskScheduler.schedule(() -> {
            Thread thread = Thread.currentThread();
            System.out.println(thread.getName() + thread.getId() + ": 我还在活着");
        }, new CronTrigger(schedulerPO.getTime()));
        schedulerPO.setScheduledFuture(future);
        list.add(schedulerPO);
        return list;
    }
}

这里关于swagger的使用,就不进行说明了,如果大家不了解,可以看这篇springboot2与swagger2整合。现在我们就可以访问http://localhost:8080/swagger-ui.html来进行测试定时任务了,

首先查询所有定时任务,如下:

我们发现,当前有一个定时任务,scheduledFuture可以看出,这个定时任务正在运行。

现在,我们继续往其中添加一个定时任务(每隔2s执行一次),如下:

再来查询定时任务列表,如下:

我们可以发现,现在有两个定时任务在运行中,如果大家不相信它们在运行,也可以去跟踪后台的操作日志。两个定时任务好像有点多余了,我们关掉id为1的定时任务吧,如下:

查询定时任务列表,如下:

通过响应结果,我们可以看出,定时任务一已经被关闭了。到此为止,定时任务的启动和关闭就被我们实现了,SpringBoot已经帮我们整合了许多功能,有时候不用第三方工具,也可以实现常见的业务。在实际项目中,大家只需要把上面的List换成更加安全可靠的存储机制就可以了。

总结

如果大家只是实现简单的定时任务,@EnableScheduling 和@Scheduled就可以满足大家的需求(cron与fixedRate 、fixedDelay不能同时使用),当然,如果大家想要实现定时任务的自我控制,SpringBoot中的ThreadPoolTaskScheduler 就可以实现效果。

详细代码可见https://gitee.com/hpaw/SpringBoot2Demo/tree/master/springboot-scheduler

AI应用质量工程实践:从评估到监控的完整体系构建 在软件工程领域,质量保障体系是确保产品稳定可靠的核心机制,涉及度量指标、保障流程和工具链的完整闭环。随着生成式AI应用的快速发展,如何将传统软件工程中的质量门禁思想引入AI领域,成为工程实践的关键挑战。其核心原理在于构建可量化、可监控、可改进的质量评估框架,通过自动化测试、持续监控和反馈优化来管理AI输出的不确定性。这一技术价值在于将AI应用从原型阶段推向产品化,确保输出的一致性、安全性和可靠性。在实际应用场景中,开发者需要从功能性、非功能性、一致性和合规性四个维度构建评估体系,并借助LLM-as-a-Ju 阅读详情

相关推荐

ArcGIS天地图矢量化秘籍:用重分类+ArcScan高效提取建筑轮廓线

本文详细介绍了利用ArcGIS重分类和ArcScan技术高效提取天地图建筑轮廓线的半自动化流程。通过动态中断值计算、多级重分类策略和ArcScan高级矢量化技巧,显著提升城市规划中的矢量化效率与精度,适用于中级GIS用户。

weixin_30879169的博客 475

Spring Boot动态设置定时任务

Spring Boot动态设置定时任务

cn_220107的博客 5451

电路课设-音响分频器电路设计

(一)题目简介 1.一阶分频器电路设计 假定高音和低音扬声器均等效为 16 欧姆电阻,设计如图 2 的简单分频器电 路,要求高低频分界(两个滤波器的截止频率)为 5kHz。 1) 写出高音扬声器和低音扬声器电压对于 vs 的传递函数,确定电路中电 容 C 和电感 L 的元件值;2)利用 AC 频率扫描分析求出两个扬声器电压的频率响应曲线,验证计算 结果。用包含高低频成分的电压 vs 激励进行测量验证。 3)计算并利用 EWB 仿真证明从 vs 看进去的阻抗为一常数 16 欧姆。

weixin_53507617的博客 1万+

利用Spring Boot提供的ScheduledExecutorService实现定期执行任务或倒计时执行任务

ScheduledExecutorService

MonGoo的博客 1488

生信实战|EffectorP3.0在植物病原菌效应子预测中的高效应用

本文详细介绍了EffectorP 3.0在植物病原菌效应子预测中的高效应用。通过机器学习模型,该工具能快速从海量分泌蛋白中批量预测胞质与质外体效应子,显著提升研究效率。文章提供了从环境配置、RNA-seq数据处理到批量预测的完整实战流程,并分享了结果解读与避坑指南,是生信研究人员进行病原物效应子鉴定的必备利器。

weixin_29195615的博客 302

倍福Beckhoff运动控制功能块实战解析:从MC_ReadActualPosition到MC_GearInVelo

本文深入解析倍福(Beckhoff)TwinCAT运动控制功能块,从基础的MC_ReadActualPosition、MC_Power等轴状态读取与使能操作,到MC_MoveAbsolute、MC_MoveRelative等单轴定位指令,并重点剖析了用于动态速度同步的核心功能块MC_GearInVelo在飞锯等场景的应用。文章结合实战经验,详细介绍了齿轮耦合、电子凸轮(MC_CamIn)等高级同步功能的参数配置、调试技巧及常见问题,旨在帮助工程师快速掌握倍福运动控制工具箱,实现复杂的同步工艺。

transformer2023的博客 983

ThreadPoolTaskScheduler spring定时任务框架,线程池配置

参数配置,只能配置核心线程池参数大小 @Bean(name = "threadPoolTaskScheduler") public ThreadPoolTaskScheduler taskScheduler() { // Spring 默认配置是核心线程数大小为1,最大线程容量大小不受限制,队列容量也不受限制。 ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); //...

吻得太逼真的博客 6082

模拟IC版图DRC实战:手把手教你搞定MIM电容天线错误和ESD.10g违例

本文深入解析模拟IC版图中的MIM电容天线错误和ESD.10g违例问题,提供从错误解码到实战修复的完整指南。通过电路图修改、版图优化和验证闭环等步骤,帮助工程师高效解决DRC错误,特别适用于ADC等精密模拟电路设计。文章还分享了高级排错技巧和预防性设计策略,大幅提升流片成功率。

weixin_27697385的博客 295

揭开 spring-context 包中 ThreadPoolTaskScheduler 的面纱

关于上一篇文章中提到的 SpringBoot 项目中当标注 @EnableScheduling 注解时会自动配置一个 ThreadPoolTaskScheduler 任务调度执行器 bean,并且 @Scheduled 的定时任务就是由该 bean 负责执行的,之前没有看过该类中的源码 , 今天正好在做定时任务好奇心的驱使下研究了一下源码: 源码路径:org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler 首先一起看一下这个类的继

JavaStudyljh的博客 812

基于STM32环境温湿度监测系统设计

基于STM32环境温湿度监测系统设计1. 实验目的2. 任务和要求3. proteus仿真图4. 实验代码 1. 实验目的 (1) 掌握使用 KEIL MDK5 进行软件开发的具体流程; (2) 掌握硬件电路的设计方法; (3) 掌握 STM32 微控制器的程序设计及代码编写方法。 2. 任务和要求 (1)在 STM32F103 平台下,通过温度传感器 DS18B20 和湿度传感器 DHT11 实现环境温湿度信息的采集; (2)将温度传感器和湿度传感器所采集的数据在 LCD 液晶屏幕上显示出来,超

唯一的博客 2万+

5步搞定ABB机器人RobotStudio与S7-1500PLC的Profinet通讯(附PLCSIM调试技巧)

本文详细介绍了如何利用RobotStudio与TIA Portal软件,结合PLCSIM Advanced仿真器,在零硬件条件下实现ABB机器人与西门子S7-1500 PLC之间的Profinet通讯虚拟调试。通过五个核心步骤,从环境搭建、网络配置、信号映射到联合仿真与高级调试,帮助工程师在项目前期高效验证逻辑、压缩现场调试周期,并掌握实用的PLCSIM调试技巧。

weixin_29188043的博客 506

spring异步执行方法线程池的配置

有注解和xml两种方式,我这里只大概记录一下注解方式,趋势=-= 首先新建一个配置类,必须被spring管理,这里就不多说了… import com.google.common.util.concurrent.ThreadFactoryBuilder; import lombok.extern.slf4j.Slf4j; import org.springframework.aop.intercep...

你就像甜甜的益达 4887

多目标优化AI Agent:增强LLM的复杂决策能力

在人工智能领域,尤其是自然语言处理(NLP)和大语言模型(LLM)的应用中,决策问题往往涉及多个目标的平衡与优化。例如,在智能客服系统中,既要提高客户满意度,又要降低运营成本;在自动驾驶中,既要确保安全,又要追求行驶效率。传统的单目标优化方法难以满足这种复杂场景的需求,因此多目标优化成为了一种必然趋势。AI Agent是一种智能系统,能够通过感知环境、处理信息并采取行动来实现特定目标。它可以是一个软件程序,也可以是一个物理设备。NSGA-II:一种基于群体的多目标优化算法,通过遗传算法的思想进行迭代优化。

AI天才研究院 1300

springboot定时任务

目录 序言 一、静态:基于注解 阅读正文: 序言 使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式: 一、基于注解(@Scheduled) 二、基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就派上用场了。 三、基于注解设定多线程定时任务 一、静态:基于注解 基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一......

乐昊的博客 9万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SpringBoot——Quartz 定时任务

⑦、W:该字符只能出现在日期域中,表示离该日期最近的工作日,例如 15W:表示离该月15号最近的工作日,如果15号是星期六则匹配星期五 14号。L在日期字段表示月份的最后一天,如一月的31,二月的28等,如果在星期域中表示星期六(7),但是如果L出现在星期字段里,而且前面有一个数值 X,则表示这个月的最后 X 天,例如:6L表示该月的最后星期五;⑤、斜杠(/):x/y 表示一个等步长序列,x为起始值,y为增量步长值,例如秒中使用 0/2 表示从0秒开始,没过2秒执行一次。如6#3:表示当月的第三个星期五。

程序猿进阶 6477

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SpringBoot定时任务说明

介绍SpringBoot定时任务,利用@Scheduled注解实现,可以通过配置applicationContext.xml来实现单线程定时任务和多线程定时任务。

loongshawn的博客 7万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SpringBoot定时任务

SpringBoot定时器

qingqingyyds的博客 2828

SpringBoot——Scheduled定时任务

简单总结springboot定时任务的使用,包括基于@Scheduled注解的静态定时任务,和继承SchedulingConfigurer类的动态定时任务。

tang_seven的博客 6009

玩转 SpringBoot 2 之整合定时任务篇

前言 通过本文你将了解到SpringBoot 2 中整合定时任务使用教程,具体详细内容如下: SpringBoot 自带定时任务使用教程 SpringBoot 集成 JDK 定时任务使用教程 SpringBoot 集成 quartz 使用教程 阅读前需要你必须了解如何搭建 SpringBoot 项目。 SpringBoot 自带定时任务使用教程 使用 SpringBoot 自带的任务调度拢共需...

程序员小奎的博客 4756

玩转SpringBoot之定时任务

详细讲解SpringBoot利用注解创建静态定时任务,利用接口创建动态定时任务,利用@EnableAsync和@Async创建多线程定时任务

Java学习之道 5685

SpringBoot使用@Scheduled创建定时任务

本章目标 基于SpringBoot架构完成注解@Scheduled的定时任务配置 项目构建 使用idea开发工具构建SpringBoot项目,idea配置的JDK是1.8,过程如下:File →New→Project→Spring Initializr 填写项目名称,用scheduled作为项目名 勾选需要的Web依赖,这里只勾选Web 选择项目存储目录,这里选的是F盘...

xyz 2万+

【SpringBoot 2学习笔记】《十》SpringBoot2 定时任务之@Scheduled注解

定时任务作为系统调度工具,在某些系统中的特定场合有着广泛应用,例如:在某个时间点统计数据、在一定的时间间隔取得最新数据等。Java开发中,以前我们实现定时任务时,最初使用Timer、TimerTask,Timer是定时器类,用来按计划开启后台线程执行指定任务,TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。还可以用第三方Quartz,Quartz是一个优秀的定时任务框架,...

黑白猿的琐碎日常 2万+

SpringBoot2.x-定时任务

Timer Timer 是 jdk 1.3 之后自带的 java.util.Timer 类。 这个类允许你按一定的规则调度一个 java.util.TimerTask 任务。主要是按照一定速率去执行任务,不支持 cron 表达式。 示例 public class TimerTest { public static void main(String[] args) { ...

MyHerux的博客 2787

springboot的定时任务注解

最近项目中用到定时任务,所以需要在spring boot项目中集成定时任务。整体来说非常简单,以下详细说明。 一、在Application启动类上添加@EnableScheduling注解启动定时,代码如下。 package com.example.task; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication...

qq_45593609的博客 4548

SpringBoot2定时任务

SpringBoot默认已经实现了定时任务。 启动类启用定时 在启动类上面加上@EnableScheduling即可开启定时。 package com.wu.parker.schedule; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.Spring...

八卦程序的专栏 814
上一篇: springboot2与rabbitmq整合
下一篇: Feign表单文件传输遇到的坑
西红柿丶番茄
博客等级 码龄10年 21粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值