当前位置: 首页 > news >正文

定时任务调度方案——Xxl-Job

定时任务调度方案

随着系统规模的发展,项目的组织结构以及架构越来越复杂,业务覆盖的范围越来越广,定时任务数量日益增多,任务也变得越来越复杂,尤其是为了满足在用户体量日历增大时,系统能够稳定运行,我们往往会扩充服务器做集群,无论是传统垂直项目还是如今主流的分布式。那么对定时任务的要求也逐渐变高,基于现在项目主流架构,定时任务需满足一下要求:

    1. 任务统一管理,提供图形化界面对任务进行配置和调度。
    1. 保证任务调度的幂等性(任务并发控制,同一个任务在同一时间只能允许一个执行)
    1. 任务弹性扩容,可根据繁忙情况动态增减服务器分摊压力,对大任务进行分片处理。
    1. 任务依赖问题,能够处理任务包含子任务的情况,前一个完成后触发子任务执行。
    1. 支持多类型的任务,支持Spring Bean、Shell等。
    1. 任务节点高可用,任务节点异常或者繁忙时能够转移到其他节点执行。
    1. 调度中心高可用,支持集群部署,避免出现单点故障。
    1. 执行状态监控,方便查看任务执行状态,异常情况告警,支持多渠道通知。

#. 发展史:
定时任务随着技术发展,从单线程调度到多线程调度,从单机部署到集群部署,从独立执行到多任务协同执行。请添加图片描述

1. Thread

通过线程休眠实现,由JDK提供

private static int count = 0;public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {while (count < 8) {try {Thread.sleep(1000);System.out.printf("执行第:%d 次\n", ++count);} catch (InterruptedException e) {e.printStackTrace();}}}};new Thread(runnable).start();
}

请添加图片描述

2. 线程池

有延缓执行实现,由JDK提供

private static int count = 0;public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 8; i++) {ExecutorService executorService = Executors.newSingleThreadScheduledExecutor();Runnable runnable = new Runnable() {@Overridepublic void run() {++count;System.out.printf("执行从 %d 次\n", count);if (count > 7) {System.exit(0);}}};// 也可以使用 ScheduledExecutorService.scheduleexecutorService.awaitTermination(1L, TimeUnit.SECONDS);executorService.execute(runnable);}
}

请添加图片描述

3. Timer TimeTask

由JDK提供,多用于移动端(如安卓开发)

private static int count = 0;public static void main(String[] args) {TimerTask timerTask = new TimerTask() {@Overridepublic void run() {System.out.printf("执行第 %d 次\n", ++count);if (count > 7) {System.exit(0);}}};Timer timer = new Timer();timer.schedule(timerTask, 500, 500);
}

请添加图片描述

4. Schedule

由Spring提供, 配合@EnableScheduling 使用

@Component
public class SpringScheduleTest {private static int count;@Scheduled(cron = "0/1 * * * * ?")public void testSchedule() {System.out.printf("执行第 %d 次\n", ++count);}
}

cron 表达式:秒-分-时-日-月-周-年

5.quartz

有maven独立依赖,在SpringBoot2.0之后自带包

  1. 纯maven项目依赖
    <!-- 核心包 -->
    <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.0</version>
    </dependency><!-- 工具包 -->
    <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.3.0</version>
    </dependency>
    
  2. SpringBoot2.0及上依赖
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>
    
  3. 测试类 Test.java
    public class Test {public static void main(String[] args) throws SchedulerException, ParseException {Scheduler factory = StdSchedulerFactory.getDefaultScheduler();JobDataMap jobDataMap = new JobDataMap();jobDataMap.put("tips", "去你大爷的");JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class).withIdentity("testJob", "testJobGroup").setJobData(jobDataMap).build();Trigger trigger = TriggerBuilder.newTrigger().withIdentity("testTrigger", "testTriggerGroup").withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5)).startNow().build();factory.scheduleJob(jobDetail, trigger);factory.start();}
    }
    
  4. 创建任务类 QuartzJob.java
    public class QuartzJob implements Job {public static int count;@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap();String tips = jobDataMap.getString("tips");System.out.printf("获取到参数:%s\n", tips);System.out.printf("执行第:%d 次\n", ++count);}
    }
    
    请添加图片描述

6. Xxl-job

XXL-JOB 是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
请添加图片描述
详细内容介绍,请查看:文档地址

  1. 创建库,并创建表,sql文件在项目目录下:xxl-job-master/doc/db/tables_xxl_job.sql
    注意:它的数据库名是 xxl_job, 如果不想创建新库,而是导入到现有的库中,需要进入sql文件中改名字。
    请添加图片描述

  2. 运行项目:xxl-job-admin

    1. 项目结构如下:
      请添加图片描述

    2. 修改mysql 连接配置如下:
      请添加图片描述

  3. 运行起来后, 在浏览器访问:http://localhost:8080/xxl-job-admin

    默认账号:admin 密码:123456

    请添加图片描述

  4. 成功登录后进入调度中心
    请添加图片描述

  5. 注册任务执行器,可以单独创建执行器服务,也可集成到现有项目服务中去
    以下为新建SpringBoot 项目为示例

    1. 创建SpringBoot 项目并添加依赖
      <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.1</version>
      </dependency>
      
    2. 在resources目录下创建application.properties文件(yaml文件也一样,如果有就不用创建了)
      # 执行器所在的服务的运行端口, 非执行器端口
      server.port=8081### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
      # 注册地址, 这个地址其实就是部署或者运行完xxl-job-admin调度中心的浏览器访问地址
      xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin### xxl-job, access token
      xxl.job.accessToken=default_token### xxl-job executor appname
      ### 执行器名称,需要配置到调度中心
      xxl.job.executor.appname=xxl-job-executor
      ### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
      xxl.job.executor.address=
      ### xxl-job executor server-info
      xxl.job.executor.ip=
      # 这个端口是执行器端口, 不是这个项目server.port 端口,也不能一样,否则会出现端口占用等错误信息
      # 也就是说,执行器项目部署或者运行起来会有两个端口,如果是用docker部署,注意两个端口都要映射到宿主机端口
      xxl.job.executor.port=9999
      ### xxl-job executor log-path
      xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
      ### xxl-job executor log-retention-days
      xxl.job.executor.logretentiondays=30
      
    3. 创建配置类 XxlJobConfig.java
      @Configuration
      public class XxlJobConfig {@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.appname}")private String appname;@Value("${xxl.job.executor.address}")private String address;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setAddress(address);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}
      }
      
    4. 创建任务 (Job),注意不同版本写法会有些不一样
      @Component
      public class SampleXxlJob {/*** 1、简单任务示例(Bean模式)*/@XxlJob("demoJobHandler")public void demoJobHandler() throws Exception {XxlJobHelper.log("XXL-JOB, Hello World.");for (int i = 0; i < 5; i++) {XxlJobHelper.log("beat at:" + i);TimeUnit.SECONDS.sleep(2);}XxlJobHelper.handleSuccess("XXL-JOB:执行成功");}
      }
      
    5. 配置执行器
      1. 配置
        请添加图片描述
      2. 成功
        请添加图片描述
    6. 配置任务并执行
      1. 配置任务
        请添加图片描述

      2. 执行一次
        请添加图片描述
        请添加图片描述

      3. 查看日志
        请添加图片描述
        请添加图片描述
        请添加图片描述

相关文章:

定时任务调度方案——Xxl-Job

定时任务调度方案 随着系统规模的发展&#xff0c;项目的组织结构以及架构越来越复杂&#xff0c;业务覆盖的范围越来越广&#xff0c;定时任务数量日益增多&#xff0c;任务也变得越来越复杂&#xff0c;尤其是为了满足在用户体量日历增大时&#xff0c;系统能够稳定运行&…...

操作系统引导

操作系统是一种程序&#xff0c;程序以数据的形式存放在硬盘中&#xff0c;而硬盘通常分为多个区&#xff0c;一个计算机中又有多个或多种外部设备。 操作系统引导指的是计算机利用CPU运行特定程序&#xff0c;通过程序识别硬盘&#xff0c;识别硬盘分区&#xff0c;识别硬盘分…...

[C#] 多线程单例子,分为阻塞型和分阻塞型, 在unity里的应用

在单例中使用多线程时&#xff0c;需要注意以下几点&#xff1a; 线程安全&#xff1a;在多线程环境下&#xff0c;单例对象可能被多个线程同时访问&#xff0c;因此需要确保单例的线程安全&#xff0c;避免出现数据竞争等问题。 对象创建&#xff1a;如果在单例对象的构造函数…...

使用MAT进行内存分析,并找到OOM问题

前言 在处理一次现场问题时&#xff0c;发现服务还在运行&#xff0c;但是出现假死情况&#xff0c;后通过分析GC日志以及使用MAT分析确定问题是内存溢出OutOfMemery(OOM)&#xff1b;这里只记录MAT分析学习过程,最近工作忙&#xff0c;补记录。 GC日志分析 首先&#xff0c;如…...

初识Python

目录初识Python1.Python简介Python的优缺点Python的应用领域2.安装Python解释器Windows环境Linux环境macOS环境3.运行Python程序确认Python的版本编写Python源代码运行程序代码中的注释4.Python开发工具IDLE - 自带的集成开发工具IPython - 更好的交互式编程工具Sublime Text -…...

tmux终端复用软件

一、安装[rootpool-100-1-1-159 test]# yum install tmux [rootpool-100-1-1-159 test]# yum search tmux Repository extras is listed more than once in the configuration Last metadata expiration check: 0:33:52 ago on Fri 03 Mar 2023 09:10:34 AM CST.Name Exactly M…...

IO详解(文件,流对象,一些练习)

目录 文件 文件概念 文件的路径 路径有俩种表示风格 文件类型 如何区分文本文件还是二进制文件? java对文件的操作 File类中的一些方法 流对象 流对象的简单概念 java标准库的流对象 1.字节流,(操作二进制数据的) 2.字符流 (操作文本数据的) 流对象最核心的四个…...

SpringCloud全家桶— — 【1】eureka、ribbon、nacos、feign、gateway

SpringCloud全家桶— — 组件搭建 1 Eureka 1.1 Eureka-server 创建eureka-server的SpringBoot项目 ①导入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId…...

【线程安全篇】

线程安全之原子性问题 x &#xff0c;在字节码文件中对应多个指令&#xff0c;多个线程在运行多个指令时&#xff0c;就存在原子性、可见性问题 赋值 多线程场景下&#xff0c;一个指令如果包含多个字节码指令&#xff0c;那么就不再是原子操作。因为赋值的同时&#xff0c…...

错误:EfficientDet网络出现“No boxes to NMS“并且mAP:0.0的解决方案

近日&#xff0c;在使用谷歌新推出来的一个网络EfficientDet进行目标检测训练自己的数据集的时候&#xff0c;出现了如下错误&#xff1a; 其中项目开源地址是&#xff1a;https://github.com/toandaominh1997/EfficientDet.Pytorch 上面截图中的1和2代表我的类别名称。读者可…...

python的opencv操作记录13——区域生长及分水岭算法

文章目录图像区域基本算法——形态学运算腐蚀与膨胀开运算与闭运算opencv中的形态学运算距离计算——distanceTransform函数连通域连通的定义计算连通域——connectedComponents连通域实验基于区域的分割区域生长算法自定义一个最简单区域生长算法实现区域分割一般区域分割open…...

一文看懂网上下单的手机流量卡为什么归属都是随机的!

最近很多网上下单的小伙伴们心中似乎都有一个疑问。那就是网上很多手机卡、流量卡都不能自选号码和归属地&#xff0c;就算能自选号码&#xff0c;归属地也是随机的而且很多都不会跟你说具体的城市&#xff0c;这是为什么呢&#xff1f;莫非其中有什么不可告人的秘密吗?小伙伴…...

python Pytest生成alluer测试报告的完整教程

1.下载allure包到本地&#xff0c;解压 网上很多资料&#xff0c;这边不提供了 2.配置环境变量 将上面解压后bin文件的路径复制&#xff0c;添加到环境变量Path下 3.验证环境变量配置是否功 在cmd中输入allure&#xff0c;回车 。查看allure是否成功&#xff1a; 4.pyc…...

4-spring篇

ApplicationContext refresh的流程 12个步骤 prepareRefresh 这一步创建和准备了Environment对象&#xff0c;并赋值给了ApplicationContext的成员变量 要理解Environment对象的作用 obtainFreshBeanFactory ApplicationContext 里面有一个成员变量&#xff0c;Beanfactory b…...

提升 Web 应用程序的性能:如何使用 JavaScript 编写缓存服务

缓存是一种重要的优化技术&#xff0c;用于加速数据访问和降低服务器负载。缓存存储经常访问的数据&#xff0c;以便在需要时可以快速检索。在本文中&#xff0c;我们将探索如何使用简单的数据结构在 JavaScript 中编写缓存服务。 编码缓存服务的第一步是定义将用于访问缓存的…...

供应商绩效管理指南:挑战、考核指标与管理工具

管理和优化供应商绩效既关键又具有挑战性。要知道价格并不是一切&#xff0c;如果你的供应商在商定的价格范围内向你开具发票&#xff0c;但服务达不到标准或货物不合格&#xff0c;你也无法达到节约成本的目标。 供应商绩效管理可以深入了解供应商可能带来的风险&#xff0c…...

干货文稿|详解深度半监督学习

分享嘉宾 | 范越文稿整理 | William嘉宾介绍Introduction to Semi-Supervised Learning传统机器学习中的主流学习方法分为监督学习&#xff0c;无监督学习和半监督学习。这里存在一个是问题是为什么需要做半监督学习&#xff1f;首先是希望减少标注成本&#xff0c;因为目前可以…...

信箱|邮箱系统

技术&#xff1a;Java、JSP等摘要&#xff1a;在经济全球化和信息技术飞速发展的今天&#xff0c;通过邮件收发进行信息传递已经成为主流。目前&#xff0c;基于B/S&#xff08;Browser/Server&#xff09;模式的MIS&#xff08;Management information system&#xff09;日益…...

JS数组拓展

1、Array.from Array.from 方法用于将两类对象转为真正的数组&#xff1a; 类似数组的对象,所谓类似数组的对象&#xff0c;本质特征只有一点&#xff0c;即必须有length属性。 因此&#xff0c;任何有length属性的对象&#xff0c;都可以通过Array.from方法转为数组 和 可遍历…...

一道很考验数据结构与算法的功底的笔试题:用JAVA设计一个缓存结构

我在上周的笔试中遇到了这样一道题目&#xff0c;觉得有难度而且很考验数据结构与算法的功底&#xff0c;因此Mark一下。 需求说明 设计并实现一个缓存数据结构: 该数据结构具有以下功能&#xff1a; get(key) 如果指定的key存在于缓存中&#xff0c;则返回与该键关联的值&am…...

英雄联盟智能辅助套件:重新定义MOBA游戏体验的开源工具集

英雄联盟智能辅助套件&#xff1a;重新定义MOBA游戏体验的开源工具集 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Tool…...

图床项目(二) 接口设计

接口设计 1 . muduo 网络模型 该模型相较于普通的reactor模型复杂一点&#xff0c;其中包括mainReactor 和 多个 subReactor &#xff0c;其中每一个 subReactor对应一个线程。 其中 mainReactor 负责处理新连接 &#xff0c; 并将连接均匀分配给 subReactor &#xff0c;后续…...

浏览器兼容性问题汇总

1.IE10版本以上浏览器input标签后面自带一个X问题IE10&#xff0c;IE11浏览器当点击input text文本框时&#xff0c;输入文本后出现一个删除功能的X按钮IE浏览器效果&#xff0c;而谷歌浏览器没有解决方案&#xff1a;给input添加如下CSS样式 input::-ms-clear{display:none;}2…...

League-Toolkit:英雄联盟智能辅助工具的效率提升之道

League-Toolkit&#xff1a;英雄联盟智能辅助工具的效率提升之道 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit是…...

Apache Tomcat 在 IDEA 中配置完整教程(手把手保姆教程)

目录 文章内容简介 配置前提 IDEA 准备 IDEA 中的配置 文章内容简介 本文详细介绍了在IDEA中配置Apache Tomcat服务器的完整步骤。首先指导用户创建Maven Archetype项目。重点讲解了Tomcat服务器的配置过程&#xff0c;包括设置服务器路径、部署工件、修改HTTP端口等关键操…...

深度解析:汇率结算下的货代对账困局,如何利用 AI 与 RPA 构建底层逻辑?

【前言】在国际物流与货运代理行业&#xff0c;财务对账向来是一块“硬骨头”。尤其是涉及跨国业务时&#xff0c;汇率的实时波动与多币种结算的交叉影响&#xff0c;使得原本复杂的账目核对工作呈几何倍数增加。传统的人工对账模式不仅效率低下&#xff0c;且在面对分位数的四…...

美军“转正”美科技公司AI系统,专家解读

来源&#xff1a;环球时报【环球时报报道 记者 刘扬】据路透社等外媒近日报道&#xff0c;五角大楼将把美国科技公司Palantir的人工智能&#xff08;AI&#xff09;系统Maven列为“正式在编项目”&#xff0c;使美军多军种将该公司的相关技术用于军事领域。五角大楼强调&#x…...

CRaxsRat v7.4隐藏功能挖掘:用自定义脚本实现批量设备自动化运维

CRaxsRat v7.4隐藏功能实战&#xff1a;JSON脚本引擎在企业级自动化运维中的高阶应用 在企业IT运维领域&#xff0c;效率提升往往隐藏在工具的高级功能层。CRaxsRat v7.4的脚本模块就像瑞士军刀的隐藏刀片——90%的用户只停留在远程桌面和文件管理的基础功能&#xff0c;却不知…...

CosyVoice Docker Compose 中 model_id 的高效配置与优化实践

最近在部署 CosyVoice 语音服务时&#xff0c;我发现 docker-compose.yml 文件里的 model_id 配置项&#xff0c;虽然看起来只是简单的一行&#xff0c;但配置得当与否&#xff0c;直接关系到整个服务的部署效率、启动速度和资源开销。如果随便填一个值&#xff0c;或者不理解其…...

终极指南:5分钟学会免费修复Minecraft损坏存档的强力工具

终极指南&#xff1a;5分钟学会免费修复Minecraft损坏存档的强力工具 【免费下载链接】Minecraft-Region-Fixer Python script to fix some of the problems of the Minecraft save files (region files, *.mca). 项目地址: https://gitcode.com/gh_mirrors/mi/Minecraft-Reg…...