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

目录标题

  • 1、自定义单线程
  • 2、JDK ScheduledExecutorService
  • 3、 Spring Task
  • 4、Quartz
  • 5、Elastic-job
  • 6、xxl-job
  • 最后:思考更上一层
        • 1. 高性能
        • 2. 高并发
        • 3. 高可用
    • 设计方案

在这里插入图片描述

1、自定义单线程

在这里插入图片描述

上图中,我们启动一个线程,该线程无限循环执行,每隔20毫秒执行业务代码。

这种方式非常简单易用,在很多中间件中得到广泛应用。

优点

  • 简单易用,易于实现。
  • 适用于小规模、低并发的应用场景。

缺点

  • 缺乏容错能力,一旦线程出错,整个任务可能会中断。
  • 不支持并发执行,性能受限。

2、JDK ScheduledExecutorService

ScheduledExecutorService 是 Java 标准库提供的一个用于调度定时任务的接口。它提供了一种相对简单的方式来执行定时任务,不需要引入额外的库。
在这里插入图片描述
在上述例子中:

  1. 创建了一个ScheduledExecutorService 实例,它使用了一个线程池,其中包含一个线程用于执行定时任务。
  2. 定义了一个简单的Runnable任务,输出当前时间。
  3. 使用scheduleAtFixedRate方法安排任务,指定了任务的启动延迟时间和执行间隔时间。
  4. 主线程等待一段时间,然后关闭ScheduledExecutorService,确保定时任务不再执行。

这是一个基本的使用例子,你可以根据需求调整延迟时间、执行间隔、线程池大小等参数。ScheduleExecutorService 因其简单易用且性能优异,在各大开源中间件项目(比如 RocketMQ等)中被广泛的使用。

优点

  • 标准库提供的功能,无需额外依赖。
  • 支持线程池管理,可以灵活配置线程数量。
  • 支持固定频率和固定延迟的任务调度。

缺点

  • 仍然需要手动管理线程池和任务调度。
  • 在高并发场景下,线程池的配置需要仔细考虑。

适用场景

  • 中小型应用,对并发有一定要求。

3、 Spring Task

在Spring框架中,你可以使用@Scheduled注解来创建定时任务。以下是Spring定时任务的基本用法:

  • 配置类: 创建一个配置类,通常使用 @EnableScheduling 注解启用 Spring 的定时任务功能。
    在这里插入图片描述

  • 定时任务方法: 在你的服务类或组件类中创建一个方法,并使用 @Scheduled 注解来指定定时任务的触发条件。
    在这里插入图片描述

在上述例子中,@Scheduled 注解允许你指定定时任务的执行规则,可以是固定频率(fixedRate)、固定延迟(fixedDelay)、或者使用cron表达式。

优点

  • 集成Spring框架,易于配置和使用。
  • 支持多种调度方式(固定频率、固定延迟、Cron表达式)。
  • 可以方便地集成到Spring应用中。

缺点

  • 需要Spring框架的支持。
  • 对于复杂的任务调度,配置较为繁琐。

适用场景

  • Spring应用,需要集成定时任务功能。

4、Quartz

Quartz是一款 Java 开源任务调度框架。
在这里插入图片描述
下面我们展示如何使用:

  1. 添加依赖

  2. Job(任务:你要做什么事)
    在这里插入图片描述

  3. Trigger(触发器:什么时候去做)

  4. scheduler(任务调度:你什么时候需要做什么事)将 job 与 Trigger 进行整合。

下面是一个例子:
在这里插入图片描述
这里需要强调的是,Quartz 支持集群模式,持久化方式是 JDBC ,需要创建如下表。
在这里插入图片描述

Quartz 集群模式对于业务数据库有侵入性,需要考虑业务场景慎重使用。

优点

  • 成熟稳定的开源框架,支持多种调度方式。
  • 支持集群和持久化,适用于高可用场景。
  • 强大的插件系统,可以扩展各种功能。

缺点

  • 配置和使用相对复杂。
  • 需要额外的数据库支持。

适用场景

  • 大型企业级应用,需要高可用和复杂调度功能。

5、Elastic-job

ElasticJob 定位为轻量级无中心化解决方案,使用 jar 的形式提供分布式任务的协调服务。

在这里插入图片描述
应用内部定义任务类,实现 SimpleJob 接口,编写自己任务的实际业务流程即可。

在这里插入图片描述
举例:应用A有五个任务需要执行,分别是A,B,C,D,E。任务E需要分成四个子任务,应用部署在两台机器上。
在这里插入图片描述

应用A在启动后, 5个任务通过 Zookeeper 协调后被分配到两台机器上,通过Quartz Scheduler 分开执行不同的任务。

ElasticJob 从本质上来讲 ,底层任务调度还是通过 Quartz ,相比Redis分布式锁 或者 Quartz 分布式部署 ,它的优势在于可以依赖 Zookeeper 这个大杀器 ,将任务通过负载均衡算法分配给应用内的 Quartz Scheduler容器。

优点

  • 轻量级无中心化解决方案,易于部署。
  • 支持分布式任务协调,适用于大规模集群。
  • 依赖Zookeeper进行任务分配,保证任务的均匀负载。

缺点

  • 需要Zookeeper支持。
  • 配置和使用相对复杂。

适用场景

  • 分布式应用,需要大规模任务协调。

6、xxl-job

XXL-JOB 是一个使用最广泛的分布式任务调度平台。

业务系统和调度平台分开部署,我们在调度平台上配置应用以及其定时任务,当任务需要执行时,调度平台会触发业务系统的任务,业务系统执行完任务之后,反馈给调度平台任务执行的结果。

接下来,我们使用 xxl-job 开发第一个任务 “Hello World”。

  1. 新建任务:登录调度中心,点击下图所示“新建任务”按钮,新建示例任务。然后,参考下面截图中任务的参数配置,点击保存。在这里插入图片描述
    在这里插入图片描述

  2. 应用任务开发
    在这里插入图片描述

  3. 触发执行
    请点击任务右侧 “执行” 按钮,可手动触发一次任务执行(通常情况下,通过配置Cron表达式进行任务调度触发)。

  4. 查看日志
    请点击任务右侧 “日志” 按钮,可前往任务日志界面查看任务日志。 在任务日志界面中,可查看该任务的历史调度记录以及每一次调度的任务调度信息、执行参数和执行信息。运行中的任务点击右侧的“执行日志”按钮,可进入日志控制台查看实时执行日志。
    在这里插入图片描述

优点

  • 提供了强大的可视化管理界面。
  • 支持多种调度方式,易于管理和监控。
  • 支持分布式部署,适用于大规模应用。

缺点

  • 需要额外部署调度中心。
  • 配置和使用相对复杂。

适用场景

  • 大型企业级应用,需要强大的任务管理和监控功能。

最后:思考更上一层

1. 高性能
  • 并发执行:使用线程池管理任务执行,确保任务可以并行处理。
  • 优化任务逻辑:减少任务中的计算开销,优化数据库查询等操作。
  • 异步处理:对于耗时较长的任务,采用异步处理机制。
2. 高并发
  • 负载均衡:使用负载均衡技术将任务分发到多个节点执行。
  • 分布式调度:使用分布式调度框架(如Elastic-Job、XXL-JOB)进行任务分配。
  • 弹性扩展:根据任务负载动态调整线程池大小。
3. 高可用
  • 故障恢复:设计任务重试机制,确保任务失败时可以自动恢复。
  • 集群部署:使用集群部署,确保单个节点故障不影响整体任务执行。
  • 持久化和备份:使用持久化机制(如Quartz的JDBC持久化)确保任务状态的持久化。
  • 监控和报警:建立完善的监控体系,及时发现并处理任务执行中的问题。

设计方案

  1. 任务调度层

    • 使用XXL-JOB或Elastic-Job作为任务调度框架。
    • 配置可视化管理界面,便于管理和监控。
  2. 任务执行层

    • 使用Spring Boot应用作为任务执行节点。
    • 配置线程池,确保任务可以并行执行。
    • 优化任务逻辑,减少不必要的计算开销。
  3. 分布式协调层

    • 使用Zookeeper进行任务分配和协调。
    • 配置负载均衡策略,确保任务均匀分配到各个节点。
  4. 持久化和备份

    • 使用数据库(如MySQL)进行任务状态的持久化。
    • 定期备份任务数据,确保数据安全。
  5. 监控和报警

    • 使用Prometheus和Grafana进行任务执行情况的监控。
    • 配置报警机制,通过邮件或短信及时通知管理员。

在这里插入图片描述

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

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

相关文章

文件操作详解:fgetc,fputc,fgets,fputs,fscanf,,fprintf,fread,fwrite的使用和例子 C语言

前言 在日常应用中,我们为了持续的使用一些数据,为了让数据可以在程序退出后可以保存并正常使用,引入了文件的概念和操作。本文分享了一些常用的文件操作函数的使用方法和各自的区别。 一、常用文件顺序读写函数 下面例程所使用的VS工程代码…

链表算法题(下)

在链表算法题(上)长中我们已经学习了一系列的链表算法题,那么在本篇中我们将继续来学习链表的算法题,接下来就继续来破解链表的算法题吧! 1.相交链表 160. 相交链表 - 力扣(LeetCode) 通过以上…

mysql开启远程访问

个人建议mysql可以用宝塔自动下载安装。 远程访问, 1.关闭防火墙,确保ip能ping通 2.ping端口确定数据库能ping通 3.本地先连上去命令行修改远程访问权限。 mysql -u root -p use mysql; select user,host from user; select host from user where u…

锐捷网络2025届校园招聘正式启动,【NTA6dni】!

锐捷网络2025届校园招聘正式启动,内推码[NTA6dni]。 原文链接点这 投递链接点这 祝大家面试顺利,offer多多~ 有问题大家可以评论,互相交流~

什么是单片机?为什么要学习单片机?

实现目标 1、熟悉单片机定义、特点、应用场景、发展历史等; 2、理解为什么要学习单片机?怎样学习单片机? 一、单片机是什么? 1、定义 单片机是集成在一块(单)芯片上的微型计算机。平时我们把 MCU&#x…

Java | Leetcode Java题解之第387题字符串中的第一个唯一字符

题目&#xff1a; 题解&#xff1a; class Solution {public int firstUniqChar(String s) {Map<Character, Integer> position new HashMap<Character, Integer>();Queue<Pair> queue new LinkedList<Pair>();int n s.length();for (int i 0; i …

KMP 详解

KMP数组存的是什么 对于一个字符串 b,下标从1开始。 则kmp[i]表示 以i结尾的连续子串 s的前缀的最大值&#xff08;等价于前缀最大结尾处&#xff09; 如何求KMP 假设 i 以前的KMP都被求出来了。 j 表示上一个字符可以成功匹配的长度&#xff08;等价于下标&#xff09; …

家里有猫用宠物空气净化器有用吗?希喂、米家、有哈哪款更好

在快节奏的现代生活中&#xff0c;越来越多的人选择宠物作为心灵的慰藉与生活的伴侣。起初&#xff0c;这份陪伴的需求简单而纯粹&#xff0c;但随着日子一天天过去&#xff0c;那份简单的情感逐渐生根发芽&#xff0c;成长为深厚的责任与爱。我在前两年养了两只猫&#xff0c;…

Spring之整合Mybatis底层源码解析

整合核心思路 由很多框架都需要和Spring进行整合&#xff0c;而整合的核心思想就是把其他框架所产生的对象放到Spring容器中&#xff0c;让其成为Bean。 ​ 比如Mybatis&#xff0c;Mybatis框架可以单独使用&#xff0c;而单独使用Mybatis框架就需要用到Mybatis所提供的一些类…

TCP滑动窗口(面试)

TCP三次握手和四次挥手 TCP滑动窗口是什么&#xff1f; 如果传输的数据比较大&#xff0c;需要拆分为多个数据包进行发送。如果TCP 协议需要收到确认应答后&#xff0c;才可以发送下一个数据包。这样的方法效率偏低 为了避免这种情况&#xff0c;TCP使用了滑动窗口。 滑动窗口…

STM32(一)简介

一、stm32简介 1.外设接口 通过程序配置外设来完成功能 2.系统结构 3.引脚定义 4.启动配置 5.最小系统电路

MySQL基础:索引

&#x1f48e;所属专栏&#xff1a;MySQL 1. 索引概述 MySQL中的索引是帮助MySQL高效获取数据的数据结构&#xff0c;可以极大地提高数据库的查询效率&#xff0c;减少数据库的I/O成本&#xff0c;就像书的目录一样&#xff0c;它可以帮助我们快速定位到书中的内容。 优势&…

Word封面对齐技巧

文章目录 前言一、对齐封面1. 点击视图&#xff0c;添加标尺2. 选中文字&#xff0c;右击段落3. 点击制表符&#xff0c;设置制表位位置4. 鼠标点击“&#xff1a;”后面&#xff0c;点击“Tab”键5. 按住“Ctrl”键&#xff0c;选中没对齐的文字&#xff0c;点击“中文板式”&…

SprinBoot+Vue学生选课微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

基于SSM+Vue+MySQL的出租车管理系统

系统背景 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本出租车管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

【启明智显技术分享】探讨CAN总线相关知识以及Model3C 2路CAN的应用

一、 CAN总线相关知识 CAN总线概述 CAN&#xff08;Controller Area Network&#xff09;总线是一种高实时性、高可靠性和灵活性的串行通信协议&#xff0c;广泛应用于汽车和工业控制系统中。它由德国BOSCH公司开发&#xff0c;最高速率可达到1Mbps&#xff0c;具有强大的检错…

DisplayManagerService启动-Android13

DisplayManagerService启动-Android13 1、DisplayManagerService启动1.1 简要时序图 2、DEFAULT_DISPLAY主屏幕添加3、默认屏幕亮度 1、DisplayManagerService启动 1.1 简要时序图 2、DEFAULT_DISPLAY主屏幕添加 3、默认屏幕亮度

AI技术颠覆游戏开发:谷歌DeepMind GameNGen实时生成《DOOM》探秘

引言 近年来&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;在图像和视频生成领域取得了巨大突破。然而&#xff0c;谁能想到&#xff0c;这项技术正逐渐渗透进游戏开发领域&#xff0c;且潜力巨大。2023年8月29日&#xff0c;谷歌DeepMind发布了名为《扩散模型是实时…

打造安心宠物乐园:EasyCVR平台赋能猫咖/宠物店的智能视频监控解决方案

随着宠物经济的蓬勃发展&#xff0c;宠物店与猫咖等场所对顾客体验、宠物安全及健康管理的需求日益提升。然而&#xff0c;如何确保这些场所的安全与秩序&#xff0c;同时提升顾客体验&#xff0c;成为了经营者们关注的焦点。引入高效、智能的视频监控方案&#xff0c;不仅能够…

浏览器百科:网页存储篇-如何在Chrome打开localStorage窗格(五)

1.引言 在前面的章节中&#xff0c;我们详细介绍了 localStorage 的基本概念、特性及其常用方法&#xff0c;帮助开发者在网页应用中实现数据的持久化存储。为了更好地管理和调试这些存储的数据&#xff0c;了解如何打开和使用浏览器的 localStorage 窗格是非常重要的。本篇文…