说说 Spring 定时任务如何大规模企业级运用

springboot一次性定时任务插入1000万条数据 阅读详情

Spring 定时任务简介

Cloud Native

定时任务是业务应用开发中非常普遍存在的场景(如:每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报表等等), 解决方案很多 ,Spring 框架提供了一种通过注解来配置定时任务的解决方案,接入非常的简单,仅需如下两步:

  1. 在启动类上添加注解@EnableScheduling
@SpringBootApplication
@EnableScheduling  // 添加定时任务启动注解
public class SpringSchedulerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringSchedulerApplication.class, args);
    }
}
复制代码
  1. 开发定时任务 Bean 并配置相应的定时注解@Scheduled
@Component
public class SpringScheduledProcessor {


  /**
     * 通过Cron表达式指定频率或指定时间
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void doSomethingByCron() {
        System.out.println("do something");
    }
    
  /**
     * 固定执行间隔时间
     */
    @Scheduled(fixedDelay = 2000)
    public void doSomethingByFixedDelay() {
        System.out.println("do something");
    }


    /**
     * 固定执行触发频率
     */
    @Scheduled(fixedRate = 2000)
    public void doSomethingByFixedRate() {
        System.out.println("do something");
    } 
}
复制代码

Spring 定时任务原理

Cloud Native

运行原理

Spring 定时任务核心逻辑主要在 spring-context 中的 scheduling 包中,其主要结构包括:

  • 定时任务解析:通过 ScheduledTasksBeanDefinitionParser 对 XML 定义任务配置解析;也可通过 ScheduledAnnotationBeanPostProcessor对@Scheduled 注解进行任务解析(常见模式)。
  • 定时任务注册登记:上述解析获得的 Task 任务配置会被注册登记至 ScheduledTaskRegistrar 中以备运行使用。
  • 任务定时运行:完成所有任务注册登记后,会通过 TaskScheduler 正式地定时运行相关任务,底层通过 JDK 的 ScheduledExecutorService 运行任务。

业务逻辑会将被包装在 ScheduledMethodRunnable 类中,其中包含了待执行的目标业务对象 Bean 和业务方法,该 Runnable 对象在运行时会被提交至 ScheduledExecutorService 调度线程池完成任务的定时运行。

从上图可以看到真正要运行的业务逻辑 ScheduledMethodRunnable 会被 ReschedulingRunnable、DelegatingErrorHandlingRunnable 做了代理扩展,这两层代理扩展具有如下意义:

  • DelegatingErrorHandlingRunnable:为业务方法运行异常进行包装处理,提供了自定义异常处理机制、解决 JDK 原生定时任务执行异常后任务失效问题。
  • ReschedulingRunnable:提供了扩展的定时模式支持,可支持基于 Trigger 接口自定义实现获取下次触发时间定时调度,默认提供的 Cron 定时通过此方式进行扩展实现。

定时模式

Spring 定时任务 Task 类的模式主要可分为两类:IntervalTask 和 TriggerTask。前者表示固定频率间隔执行,后者则采用 Trigger 触发器模式实现定时调度,Cron 表达式配置为该模式实现。

  • FixedDelay:按固定延迟频率执行,任务下一次触发时间=上一次执行结束时间+Delay 延迟时间。

  • FixedRate:按固定频率触发执行,任务下一次触发时间=上一次触发时间+Delay 延迟时间。如果上一次执行方法不结束会阻塞下一次任务执行。

  • Cron 表达式:按 Cron 表达式计算下一次触发时间,任务下一次触发时间=cron(上一次执行结束时间)。

进阶扩展

  • 线程池运行

默认配置下底层运行的线程池为单线程,单线程的运行模型在任务量较多且触发频率较高的情况下,一旦某个任务发生阻塞会导致所有后续定时任务运行阻断,这对业务运行带来严重隐患。常见可采用如下方式:

  • 配置定时执行线程池:常见基于配置 Spring Boot 配置(spring.task.scheduling.pool.size=线程数),线程数大小取决于任务数及调度频率合理配置。
  • 配置异步任务:在 spring context 中的 scheduling 模块下提供了@EnableAsync 和@Async,可用于开启任务异步执行,实现定时调度线程池非阻塞运行。该模式下存在一些不足之处:异常处理需要走异步调用的 AsyncUncaughtExceptionHandler 异常处理接口实现,同步/异步定时任务异常处理机制不统一,另外异步模式增加了业务应用的线程开销。
@Scheduled(fixedDelay = 2000)
@Async
public void test() {
    System.out.println(DateUtil.now()+ " test.");
}
复制代码
  • 异常统一处理

定时任务运行可设置统一异常处理,基于 ErrorHandler 接口开发对应异常处理实现类。对应的异常实现处理类需要注入到核心的 ThreadPoolTaskScheduler 中,用户可以通过自定义 TaskSchedulerCustomizer 方式来实现 ErrorHandler 自定义异常处理 Bean 注入至 ThreadPoolTaskScheduler 中。

@Component
public class DemoTaskSchedulerCustomizer implements TaskSchedulerCustomizer {
    @Override
    public void customize(ThreadPoolTaskScheduler taskScheduler) {
        taskScheduler.setErrorHandler(new DemoErrorHandler());
    }


    private class DemoErrorHandler implements ErrorHandler {
        @Override
        public void handleError(Throwable throwable) {
            System.out.println("异常统一处理.");
        }
    }
}
复制代码

原生 Spring 定时任务在企业中遇到的问题

Cloud Native

任务重复执行

Spring 定时任务,只要有注解就会执行,在分布式场景下,所有机器代码一致,会导致同一个任务在多台机器上重复执行。 一般的解决方案是抢锁触发,分布式锁实现形式可采用 DB、ZK、Redis 等方式。

示例代码 如下:

@Component
@EnableScheduling
public class MyTask {
    /**
     * 每分钟的第30秒跑一次
     */
    @Scheduled(cron = "30 * * * * ?")
    public void task1() throws Exception {
        String lockName = "task1";
        if (tryLock(lockName)) {
            System.out.println("hello cron");
            releaseLock(lockName);
        } else {
            return;
        }
    }
    private boolean tryLock(String lockName) {
        //TODO
        return true;
    }
    
    private void releaseLock(String lockName) {
        //TODO
    }
}
复制代码

如 上图所示,当任务触发时 3 个 server 会对任务抢锁,仅获得任务锁的 server 才能执行对应任务业务逻辑。 当前的这个设计,仔细一点的同学可以发现,其实还是有可能导致任务重复执行的。 比如任务执行的非常快,A 这台机器抢到锁,执行完任务后很快就释放锁了。 B 这台机器后抢锁,还是会抢到锁,再执行一遍任务。

无管控无运维

原生 Spring 定时任务没有控制台,无法动态的新增和修改定时任务,如果要修改定时任务的配置(比如每分钟跑一次改成每小时跑一次),必须修改代码重新发布应用。 同时原生Spring定时任务也没有运维操作,不支持运行一次任务,任务失败了也不支持重跑任务。

如果要自研的可视化控制台来实现整套任务可视化管控体系,需要一定的前后端研发成本和服务部署成本投入。对于需要自建的用户而言,可参考以下需求功能进行自有平台建设:

  • 任务的可视化动态配置
  • 任务执行运行详细信息的可视化查看
  • 任务执行日志、执行调用链、调度触发的可视化查询分析
  • 业务应用间任务信息配置权限隔离

无业务失败通知能力

对于完整企业级定时任务运用方案中,报警通知能力必不可少,任务跑失败了需要及时通知到用户,否则可能产生故障。

原生 Spring 定时任务不支持报警通知能力,如果要自研,可以参考上一章节中《异常统一处理》对任务失败的信息进行收集,构建相应的异常处理机制(包括对接各类报警平台进行异常消息通知处理,定义异常等级和类别进行不同的通知策略),然后进行 定时任务报警通知。

无在线排查分析能力

定时任务在运行过程中会存在各种各样的问题,比如: 执行失败、执行耗时、执行卡住等,这些都需要在后期实际运维去定位快速分析。 在对应分析过程中没有高效在线排查能力的话将遇到很多棘手的问题:

  • 集群中任务对应时间点是跑在哪个机器上无从可知
  • 需要在大量的业务应用日志中去检索对应时点的定时任务执行日志,需要自行对接日志服务改善
  • 如果任务涉及多个跨服务调用,无法定位执行异常点或执行耗时点,需要自建全链路追踪来支持

阿里云 Spring 定时任务企业级解决方案

Cloud Native

接下来主要讲下如何利用公有云上任务调度 SchedulerX 轻松接入基于 Spring 开发的定时任务。前面聊了基于 Spring 原生功能在使用过程中面临的问题及需要自行处理解决的相关方案,可以看到仅针对企业级最基础的运用场景下就需要花费较多的改造投入及相关服务后续运维投入。通过接入 SchedulerX 任务调度平台,原本 Spring 定时任务使用者可无缝且 0 改造获得企业级运用所需能力,同时降低了自研部署运维定时服务相关组件的技术成本。

如何接入

对于 SchedulerX 新用户而言接入仅需三步(参考附件接入手册):

  • 依赖 SchedulerX 的 Spring Boot 版 SDK 完成调度平台接入(版本>=1.7.2,老用户仅升级 SDK 版本即可)
  • 配置文件添加配置项,配置开启后 Spring 定时调度器将不运行相关任务(未配置情况下,不会主动接管原 Spring 定时任务运行,在配置开启前不会影响原本定时任务业务运行)
# 配置表示由SchedulerX接管Spring定时任务运行
spring.schedulerx2.task.scheduling.scheduler=schedulerx
复制代码
  • 控制台上在对应应用分组下创建任务配置定时触发。也可以选择开启自动同步任务配置方式(可选)
# 自动同步Spring定时任务至调度平台,无需单独手动创建(默认不开启)
spring.schedulerx2.task.scheduling.sync=true
复制代码

接入优势

  • 白屏管控和运维

提供白屏控制台可以动态新增、修改、启用、禁用任务,支持运行一次、原地重跑、重刷数据、停止任务、标记成功等运维操作。

  • 可视化在线排查问题

支持执行记录查看、执行业务日志查询、执行全链路追踪。

  • 丰富的报警通知

SchedulerX 提供丰富的报警通知能力 ,支持短信、电话、邮件、webhook 报警,支持报警联系人组和报警历史,可白屏动态配置。

  • 其他优势

  • 无改造成本的平台接入方案。
  • 无需额外独立运维调度服务平台或其他第三方组件服务。
  • 任务运行在集群环境中具备稳定高可靠支持,规避了原生框架存在的重复执行问题,具备故障自动转移能力。
  • 在企业内多个团队可共享一套平台使用,通过命名空间和应用分组实现各团队任务配置数据隔离及环境隔离。

总结

Cloud Native

本文主要从 Spring 定时任务的运行机制进行剖析阐述,并对如何扩展框架原生能力以满足企业级生产环境运行定时任务所需各种场景提出了相应的建议,用户可作参考构建自己内部定时任务方案。 同时就阿里云上提供的任务调度服务如何接入 Spring 定时任务的运行进行讲解,并简单展示了接入后所带来的企业级能力。 最后欢迎有定时任务业务需求用户可先通过基础免费额度体验感受云上服务带来便捷。

Spring Boot集成定时任务框架全解析 通过本文的详细解析,相信您已经掌握了Spring Boot集成主流定时任务框架的核心要点。无论是轻量级的@Scheduled,还是企业级的Quartz,亦或是分布式的XXL-JOB,每种方案都有其独特的适用场景。‌技术选型的本质是平衡‌——在开发效率、维护成本、系统复杂度之间找到最适合业务的最优解。你在实践中遇到过哪些棘手的定时任务问题?是任务雪崩还是分布式锁失效?欢迎在评论区分享你的实战经历! 阅读详情

相关推荐

Spring Boot框架在Java领域的定时任务调度优化_副本2

本文旨在为Java开发者提供Spring Boot框架下定时任务调度的全面优化指南。我们将覆盖从基础配置到高级优化的完整知识体系,特别关注高并发、分布式环境下的调度挑战。文章首先介绍定时任务的基本概念,然后深入Spring Boot的两种主要调度方式,接着探讨优化策略,最后展示分布式环境下的解决方案。Cron表达式:用于配置定时任务执行时间的字符串格式任务调度器(Scheduler):负责管理和执行定时任务的组件任务触发器(Trigger):定义任务执行条件的组件任务持久化。

AI开发架构师 970

聊聊springboot的Customizer

本文主要研究一下springboot的Customizer。

go4it 591

SpringBoot+Mybatis+定时任务实现大数据量数据分表记录和查询

业务场景:需要记录大量定位数据,形成轨迹回放功能。此时不能将所有的点位数据存储进一个表中,需要进行分表操作,涉及如下几个步骤1、一个建立一个新表,表名以日期结尾。2、每天的点位数据存储进对应日期的表中。3、按照时间区间参数查询点位表时,关联多个表的查询结果并返回。在上面的框架的使用基础上,在定时任务中执行固定的代码,在代码中获取某个表的建表语句,然后以时间为后缀新建新的一个表。...

BADAO_LIUMANG_QIZHI的博客 3616

SpringBoot基础篇(九):SpringTask应用

      Spring3.0后提供Spring Task实现任务调度,支持按日历调度,相比Quartz功能稍简单,但是在开发基本够用,支持注解编程方式。我们这里是在SpringBoot下应用SpringTask。 1、SpirngTask入门 【入门案例】 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import or...

u013089490的博客 525

Cadence IC618/Spectre231安装避坑指南:详解环境变量配置与License管理那些事儿

本文深入解析Cadence IC618/Spectre231安装过程中的环境变量配置与License管理难题,提供从变量冲突解决到高效License管理的实用方案。针对常见的64位标识冲突、路径污染及License服务器连接问题,给出具体诊断步骤和优化建议,帮助用户构建稳定可靠的EDA环境。

weixin_33737134的博客 616

AR1020触摸控制器驱动开发:嵌入式I²C/SPI底层集成指南

电容式触摸控制器是现代嵌入式人机交互(HMI)系统的核心感知单元,其工作原理基于寄生电容变化检测与数字信号处理。Microchip AR1020 作为典型单芯片方案,内置硬件滤波、多点跟踪与手势识别引擎,通过I²C或SPI接口输出结构化事件数据,显著降低主控MCU负载。该类器件的技术价值在于平衡精度、功耗与实时性,广泛应用于工业HMI、医疗设备及车载终端等对可靠性要求严苛的场景。本文聚焦AR1020的寄存器映射、中断驱动模型、坐标解析机制及在STM32平台的HAL/LL级工程实现,涵盖硬件时序约束、固件配置

weixin_29323977的博客 600

Spring 定时任务如何大规模企业级运用

定时任务是业务应用开发中非常普遍存在的场景(如:每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报表等等), 解决方案很多 ,Spring 框架提供了一种通过注解来配置定时任务的解决方案,接入非常的简单,仅需如下两步:1. 在启动类上添加注解@EnableScheduling@EnableScheduling // 添加定时任务启动注解}}2. 开发定时任务 Bean 并配置相应的定时注解@Scheduled@Component/**

Huangjiazhen711的博客 194

UniApp X 网络请求避坑指南:从 JS 到 UTS 的 JSON 数据处理全解析

摘要:UniAppX开发中处理JSON数据时,UTS强类型特性要求开发者改变JS习惯。本文对比两种主流方案:1)UTSJSONObject通过keypath访问数据,兼容JS但缺乏类型提示;2)type+泛型方案,通过定义数据类型实现强类型校验和智能提示,推荐用于固定数据结构。文章详细演示了两种方式的具体实现、转换方法及实战案例,并提供了类型定义技巧和注意事项,帮助开发者编写更稳定高效的跨平台应用。

归梦工作室 2790

@Scheduled,Quartz,XXL-JOB三种定时任务总结

Quartz是一个开源的、功能强大且灵活的作业调度框架,它支持复杂的调度需求,作业持久化、集群部署等功能。它允许你按照设定的时间规则执行特定的任务,例如定时执行、循环执行、间隔执行等。Quartz可以与Spring等框架无缝集成,被广泛应用于企业级应用中。XXL-JOB是一个分布式任务调度平台,用于在分布式系统中进行任务调度和管理。XXL-JOB提供了可视化的任务管理界面、任务的动态添加、修改、删除等功能。它支持分布式部署,并提供了任务执行日志、任务运行状态等监控功能。

m0_72075879的博客 3591

【机器人】机械臂控制入门技术栈分享

机械臂控制入门技术栈分享1.前言2.机器人控制入门技术栈2.1.空间描述和变化2.2.运动学分析2.3.动力学建模2.4.控制入门学习3.进阶部分3.1.机器人参数辨识3.2.非线性控制3.3.现代机器人描述方法:指数坐标4.总结 1.前言 今天看到优快云上有个分享个人技术栈的活动,虽然我不是一个正规的程序员,也不搞前端、后端这些,但我一直在优快云上通过写博客对我的学习进行总结,于是我突发奇想,不如我也写一下我的个人技术栈,针对机械臂控制入门的,因为我水平也不高,所以本文内容也许不够饱满,也不够准确,但

要恰饭得嘛 5858

RAGFlow系列(06):从0.20.0版本升级到最新版的完整指南

本文提供了从RAGFlow 0.20.0版本升级到最新版的完整指南。升级前务必进行数据、配置和状态的三层备份,尤其是智能体配置因版本间存在不兼容风险。指南详细说明了如何优雅停止服务、拉取新代码、检查并调整配置文件(如端口、环境变量),以及最终部署验证的步骤,确保升级过程平滑安全。

weixin_29243279的博客 464

Spring Boot定时任务7大坑与解决方案

定时任务是后端系统实现自动化作业的核心组件,其原理是通过调度器按照预定策略触发任务执行。在Java生态中,Spring Boot的@Scheduled注解因其声明式编程模型和零配置特性,成为开发者最常用的轻量级解决方案。该技术通过线程池调度、Cron表达式等机制,广泛应用于数据统计、缓存刷新等需要周期执行的业务场景。但在分布式环境和高并发场景下,开发者常会遇到任务阻塞、重复执行等典型问题。合理配置线程池、实现分布式锁,并集成Prometheus监控等工程实践,能有效提升定时任务的可靠性。本文重点解析单线程阻

weixin_30633405的博客 423

Linux实战:rMATS可变剪切分析从零到一,避坑指南与结果深度解析

本文详细介绍了在Linux系统上从零开始部署rMATS进行可变剪切分析的完整流程,包括环境搭建、安装避坑指南、参数优化及结果解读。特别针对gfortran依赖、数学库配置等常见问题提供解决方案,并深入解析JC与JCEC结果的差异及可视化技巧,帮助生物信息学研究者高效完成可变剪切分析。

weixin_30394669的博客 409

@Scheduled,Quartz,XXL-Job三种定时任务总结

简介@Schedule是Spring框架提供的一种简单的定时任务调度方法,通过注解的方式即可实现定时任务的调度。它适用于简单的定时任务需求,例如每隔一段时间执行一次任务或者在特定时间执行任务。@Scheduled可以轻松地集成到Spring应用中,但在处理复杂地调度需求时可能显得不够灵活。代码示例。

qq_36896711的博客 1849

SQL中的时间计算:员工每日工作时长

摘要:本文介绍了一个使用SQL查询计算员工每日工作时长的实用方法。通过分析包含员工打卡记录的数据库表,利用CTE(公共表表达式)将日期分组,计算最早和最晚打卡时间差,最终以"小时:分钟"格式输出工作时长。该方法适用于每日两次打卡的场景,并提示了处理漏打卡等特殊情况时的注意事项,为企业考勤管理提供了有效的数据支持方案。(148字)

m0_74337424的博客 412

SAP-ABAP:SAP信贷管理核心:CL_UKM_BUPA_FACTORY类完整解析与实践指南

SAP信贷管理核心类CL_UKM_BUPA_FACTORY解析 CL_UKM_BUPA_FACTORY是SAP信贷管理(UKM)模块的核心类,作为业务伙伴信贷数据的中央控制台,它提供: 统一入口:标准化实例化客户/供应商信贷对象 主要功能: 获取单条/批量业务伙伴数据 安全保存数据变更 封装底层数据访问逻辑 典型应用场景: 信贷主数据批量维护 自动化限额调整 订单信贷实时检查 性能优化建议: 使用批量方法替代循环单条处理 合理设置字段选择 实施缓存策略 该类通过简洁API简化复杂信贷操作,是SAP信贷管理开

baidu_35680696的博客 1209

Spring框架的应用场景

Spring 框架因其丰富的功能和灵活性,在 Java 开发领域中有广泛的应用场景。企业级应用开发Web 应用开发微服务架构RESTful 服务数据访问和持久化JDBC 数据库操作ORM 框架集成NoSQL 数据库操作批处理和定时任务批处理定时任务消息队列消息传递安全性认证和授权单元测试和集成测试单元测试集成测试其他应用场景日志记录国际化支持缓存支持通过这些应用场景,Spring 框架成为了 Java 领域内最受欢迎的开发框架之一,广泛应用于企业级应用开发中。

yuehua00的专栏 3260

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spring Batch Lightmin 使用教程

Spring Batch Lightmin 使用教程 项目介绍 Spring Batch Lightmin 是一个基于 Spring Boot 的客户端/服务器批处理和调度平台。它构建在 Spring Batch 之上,提供了丰富的功能和灵活的配置选项,适用于需要批处理和调度任务的企业级应用。 项目快速启动 环境准备 JDK 1.8 或更高版本 Maven 3.x Git 克隆项目 git c...

gitblog_00126的博客 744

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

如何实现一个定时任务?六种策略可实现

构建高性能、高并发、高可用的定时任务架构需要综合运用多种技术和策略。通过使用分布式调度框架(如Elastic-Job、XXL-JOB)、线程池管理、任务优化、负载均衡、故障恢复机制、持久化和备份,以及实时监控与报警,可以确保任务在复杂环境下稳定高效地执行。这样的架构设计能够满足大规模应用的需求,保证任务的可靠性和性能。

无休居士的博客 1395

IEM模型,地表粗糙度模拟

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

上一篇: 数据异构就该这样设计,yyds
下一篇: 《雨夜》 RocketMQ源码系列(一) NameServer 核心源码解析
java小姜在线冲
博客等级 码龄4年 53粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值