【XXL-JOB】XXL-JOB的搭建和使用

news2024/9/29 1:30:05

【XXL-JOB】XXL-JOB的搭建和使用

文章目录

  • 【XXL-JOB】XXL-JOB的搭建和使用
    • 1. 任务调度
      • 1.1 实现任务调度
        • 1.1.1 多线程实现
        • 1.1.2 Timer实现
        • 1.1.3 ScheduledExecutor实现
    • 2. 分布式任务调度
      • 2.1 采用分布式的原因
    • 3. XXL-JOB
      • 3.1 XXL-JOB介绍
      • 3.2 执行流程
    • 4. 搭建XXL-JOB
      • 4.1 创建数据库
      • 4.2 导入依赖,配置执行器
      • 4.3 调度中心配置
      • 4.4 执行任务
      • 4.5 查看日志
      • 4.6 停止任务

1. 任务调度

任务调度:顾名思义,就是对任务的调度,它是指系统为了完成特定业务,基于给定时间点,给定时间间隔或者给定执行次数自动执行任务

那么,我们如何去高效的处理一批任务呢?这里有两种方案:

  1. 多线程(多线程可以充分利用单机的资源)
  2. 分布式+多线程(充分利用多台计算机资源,每台计算机使用多线程)

方案2的可扩展性更强,这是一种分布式任务调度的处理方案。

那么什么又是分布式任务调度呢?

给定多个场景:

  • 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。
  • 某财务系统需要在每天上午10点前结算前一天的账单数据,统计汇总。
  • 某电商平台每天凌晨3点,要对订单中的无效订单进行清理。
  • 12306网站会根据车次不同,设置几个时间点分批次放票。
  • 。。。。。。

以上这些问题,就是任务调度需要解决的问题。


1.1 实现任务调度

1.1.1 多线程实现

我们可以开启一个线程,每隔一段时间就去执行一个任务。

如下代码所示:

这个程序的功能是每隔1s,执行一次。

public static void main(String[] args) {    
    //任务执行间隔时间
    final long timeInterval = 1000;
    Runnable runnable = new Runnable() {
        public void run() {
            while (true) {
                //TODO:something
                try {
                    Thread.sleep(timeInterval);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    Thread thread = new Thread(runnable);
    thread.start();
}

Jdk也为我们提供了相关支持,如Timer、ScheduledExecutor。


1.1.2 Timer实现

如下代码的功能是1s之后开始调度,并且每隔2s执行一次。

public static void main(String[] args){  
    Timer timer = new Timer();  
    timer.schedule(new TimerTask(){
        @Override  
        public void run() {  
           //TODO:something
        }  
    }, 1000, 2000);  //1秒后开始调度,每2秒执行一次
}

Timer 的优点在于简单易用,每个Timer对应一个线程,因此可以同时启动多个Timer并行执行多个任务,同一个Timer中的任务是串行执行。


1.1.3 ScheduledExecutor实现

public static void main(String [] agrs){
    ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
    service.scheduleAtFixedRate(
            new Runnable() {
                @Override
                public void run() {
                    //TODO:something
                    System.out.println("todo something");
                }
            }, 1,
            2, TimeUnit.SECONDS);
}

Java 5 推出了基于线程池设计的 ScheduledExecutor,其设计思想是,每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰。


2. 分布式任务调度

通常任务调度的程序是集成在应用中的,比如:优惠卷服务中包括了定时发放优惠卷的的调度程序,结算服务中包括了定期生成报表的任务调度程序,由于采用分布式架构,一个服务往往会部署多个冗余实例来运行我们的业务,在这种分布式系统环境下运行任务调度,我们称之为分布式任务调度

如下图:

image-20230301194814914


2.1 采用分布式的原因

不管是任务调度程序集成在应用程序中,还是单独构建的任务调度系统,如果采用分布式调度任务的方式就相当于将任务调度程序分布式构建,这样就可以具有分布式系统的特点,并且提高任务的调度处理能力。

所以分布式调度要实现的目标是:

  1. 并行任务调度: 并行任务调度实现靠多线程,如果有大量任务需要调度,此时光靠多线程就会有瓶颈了,因为一台计算机CPU的处理能力是有限的。如果将任务调度程序分布式部署,每个结点还可以部署为集群,这样就可以让多台计算机共同去完成任务调度,我们可以将任务分割为若干个分片,由不同的实例并行执行,来提高任务调度的处理效率。
  2. 高可用:若某一个实例宕机,不影响其他实例来执行任务。
  3. 弹性扩容:当集群中增加实例就可以提高并行任务的处理效率。
  4. 任务管理与监测:对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况,从而做出快速的应急处理响应。
  5. 避免任务重复执行:当任务调度以集群方式部署,同一个任务调度可能会执行多次,比如在上面提到的电商系统中到点发优惠券的例子,就会发放多次优惠券,对公司造成很多损失,所以我们需要控制相同的任务在多个运行实例上只执行一次。

注:第五点尤为重要。


3. XXL-JOB

3.1 XXL-JOB介绍

XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

官网:XXL-JOB

文档:XXL-JOB文档

XXL-JOB主要有调度中心执行器任务

image-20230301200040297

  • 调度中心:
    • 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码
    • 主要职责为执行器管理、任务管理、监控运维、日志管理等
  • 执行器:
    • 负责接收调度请求并执行任务逻辑
    • 主要职责是注册服务、任务执行服务(接收到任务后会放入线程池中的任务队列)、执行结果上报、日志服务等
  • 任务:
    • 负责执行具体的业务处理。

3.2 执行流程

调度中心与执行器之间的工作流程如下:

image-20230301200452907

执行流程:

  1. 任务执行器根据配置的调度中心的地址,自动注册到调度中心
  2. 达到任务触发条件,调度中心下发任务
  3. 执行器基于线程池执行任务,并把执行结果放入内存队列中,把执行日志写入日志文件中
  4. 执行器消费内存队列中的执行结果,主动上报给调度中心。
  5. 当用户在调度中心查看任务日志,调度中心请求任务执行器,任务执行器读取任务日志文件并返回日志详情。

4. 搭建XXL-JOB

首先下载XXL-JOB:

  • GitHub:https://github.com/xuxueli/xxl-job
  • Gitee:https://gitee.com/xuxueli0323/xxl-job

下载后使用idea打开项目:

image-20230301210357133

项目模块有三个:

  • xxl-job-admin:调度中心
  • xxl-job-core:项目的核心包
  • xxl-job-executor-samples:执行器示例代码(可参考)
    • xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式;
    • xxl-job-executor-sample-frameless:无框架版本;
  • doc:文档资料,包含数据库脚本

4.1 创建数据库

创建数据库,并导入doc文档中的数据库脚本:

image-20230301210848082

导入成功之后,运行xxl-job-admin项目,登陆账号为:admin,密码为:123456


4.2 导入依赖,配置执行器

1)导入依赖

在我们需要执行任务调度的模块中导入如下依赖:

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
</dependency>

2)yml配置

在配置文件(可以在nacos或本地文件)中配置:

xxl:
  job:
    admin: 
      addresses: http://localhost:8080/xxl-job-admin
    executor:
      appname: media-process-service #执行器名字(很重要,在调度中心要用到)
      address: 
      ip: 
      port: 9999 #执行器端口号
      logpath: /data/applogs/xxl-job/jobhandler
      logretentiondays: 30
    accessToken: default_token

3)配置xxl-job的执行器

将示例工程下的配置类拷贝到自己的service工程下:

image-20230301211727638


4.3 调度中心配置

进入调度中心添加执行器:

image-20230301211854828

点击新增,弹出如下对话框:

image-20230301212024511

图中的 AppName 填我们上面配置文件中配置的执行器名字,名称随意。其他的可以不填。

填写完毕之后点击保存。

image-20230301212231804

重新运行我们的项目,如果控制台中输出如下内容说明执行器在调度中心注册成功:

image-20230301212326198

同时,我们可以在调度中心中查看到执行器的地址:

image-20230301212406237


4.4 执行任务

我们复制示例工程中的 SampleXxjJob 到我们的项目中:

image-20230301212507507

我们删除部分代码,只留如下代码(任务代码):

@Component
public class SampleXxlJob {
    private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);
    
    /**
     * 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);
        }
        // default success
    }
}

1)在调度中心添加任务

进入调度中心,在任务管理中新增任务:

image-20230301212722378

点击新增,填写任务信息:

image-20230301212807950

注意红色标记处:

调度类型选择Cron,并配置Cron表达式设置定时策略。

Cron表达式是一个字符串,通过它可以定义调度策略,格式如下:

{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}

xxl-job提供图形界面去配置:

image-20230301212846797

运行模式有BEAN和GLUE,bean模式较常用就是在项目工程中编写执行器的任务代码,GLUE是将任务代码编写在调度中心。

JobHandler任务方法名填写@XxlJob注解中的名称。

添加成功后,启动任务。

image-20230301213029511


4.5 查看日志

点击左侧菜单栏“调度日志”即可查看任务执行情况:

image-20230301213139238

任务执行了一段之间要注意清理日志,点击右上角的“清理”按钮即可。


4.6 停止任务

如果想要停止任务,需要在调度中心中操作:

image-20230301213327743

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ep_操作系统面试题-操作系统的分类

答案 单体系统 整个操作系统是以程序集合来编写的&#xff0c;链接在一块形成一个二进制可执行程序&#xff0c;这种系统称为单体系统。 分层系统 每一层都使用下面的层来执行其功能。 微内核 微内核架构的内核只保留最基本的能力&#xff0c;把一些应用放到了用户空间 客户-…

BCN点击试剂1263166-90-0,endo BCN-OH,环丙烷环辛炔羟基

endo BCN-OH基础产品数据&#xff1a;CAS号&#xff1a;1263166-90-0中文名&#xff1a;环丙烷环辛炔甲醇&#xff0c;环丙烷环辛炔羟基英文名&#xff1a;endo BCN-OH 结构式&#xff08;Structural&#xff09;&#xff1a;详细产品数据&#xff1a;Molecular formula&#x…

CVPR 2023 | 基础模型推动语义分割的弱增量学习

前言语义分割的弱增量学习&#xff08;WILSS&#xff09;目的是学习从廉价和广泛可用的图像级标签中分割出新的类别&#xff0c;但图像级别的标签不能提供定位每个片段的细节。为了解决该问题&#xff0c;本文提出了一个新颖且数据高效的框架&#xff08;FMWISS&#xff09;。该…

IM即时通讯开发实时消息的“时序性”与“一致性”

我们都知道&#xff0c;一个典型的分布式系统中&#xff0c;很多业务场景都需要考虑消息投递的时序&#xff0c;例如&#xff1a;IM中单聊消息投递&#xff1a;保证发送方发送顺序与接收方展现顺序一致&#xff1b;IM中群聊消息投递&#xff1a;保证所有接收方展现顺序一致&…

如何审计一个智能合约

智能合约审计用于整个 DeFi 生态系统&#xff0c;通过对协议代码的深入审查&#xff0c;可以帮助解决识别错误、低效代码以及这些问题。智能合约具有不可篡改的特点&#xff0c;这使得审计成为任何区块链项目安全流程的关键部分。 代码审计对任何应用程序都很重要&#xff0c;…

【ES】Elasticsearch核心基础概念:文档与索引

es的核心概念主要是&#xff1a;index(索引)、Document(文档)、Clusters(集群)、Node(节点)与实例&#xff0c;下面我们先来了解一下Document与Index。 RESTful APIs 在讲解Document与Index概念之前&#xff0c;我们先来了解一下RESTful APIs&#xff0c;因为下面讲解Documen…

Antd Form校验没有效果的问题

问题是这样的&#xff1a; 环境&#xff1a; antd4.x 现象&#xff1a; 如上页面 出现页面后直接点击按钮触发校验&#xff0c;不会有校验提示&#xff0c;页面没有任何反应假如只有其中任何一个&#xff0c;校验正常 比如&#xff0c;没有“模型编码”&#xff0c;只有“模…

变分推断 (Variational Inference) 解析

前言 如果你对这篇文章可感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 变分推断 在贝叶斯方法中&#xff0c;针对含有隐变量的学习和推理&#xff0c;通常有两类方式&#xff0c;其一是马尔可…

Python爬虫:如何自动化下载网站图片

目录 Requests 访问页面 XPath 定位 JSON 对象 如何使用 XPath 自动下载百度图片 Selenium 库模拟浏览器 Requests 访问页面 Requests 是 Python HTTP 的客户端库&#xff0c;编写爬虫的时候都会用到&#xff0c;编写起来也很简单。它有两种访问方式&#xff1a;Get 和 P…

王道操作系统课代表 - 考研计算机 第五章 输入输出管理 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记&#xff0c;以及一整年里对 操作系统 知识点的理解的总结。希望对新一届的计算机考研人提供帮助&#xff01;&#xff01;&#xff01; 关于对 “输入输出管理” 章节知识点总结的十分全面&#xff0c;涵括了《操作系统》课程里的…

基于.NET 7 + iView 的前后端分离的通用后台管理系统开源框架

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 今天给大家推荐一套前后端分离通用后台管理系统开源框架。 项目简介 这是基于.Net 7 Vue.js开发的、前后端分离框架&#xff0c;前端UI框架采用iView&#xff0c;该项目只有基础功能模块&#xff0c;不包含具…

VMware虚拟机安装centos(超详细图文教程)

1、centos下载 Ubuntu下载地址&#xff1a;点这里 下载不成功的也可关注公众号获取&#xff1a;待更新 2、打开VMware VMware安装过程&#xff1a;待更新 2.1 创建新的虚拟机 2.2 一般情况都会选择典型&#xff08;如果这里有需要选择自定义的一般也不会看教程了&#xff…

【Spark分布式内存计算框架——Spark Streaming】10. 应用案例:百度搜索风云榜(中)实时数据ETL存储

5.3 实时数据ETL存储 实时从Kafka Topic消费数据&#xff0c;提取ip地址字段&#xff0c;调用【ip2Region】库解析为省份和城市&#xff0c;存储到HDFS文件中&#xff0c;设置批处理时间间隔BatchInterval为10秒&#xff0c;完整代码如下&#xff1a; package cn.itcast.spar…

华为机试题:HJ94 记票统计(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

linux和windows中安装emqx消息服务器

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号雄雄的小课堂 现在是&#xff1a;2023年3月1日21:53:55 前言 最近几天看了下mqtt&#xff0c;通过不断的搜索资料&#xff0c;也将mqtt集成到项目中&#xff0c;跑了个demo运行&#xff0c;和预想中的差不多&#x…

Altair 宣布将于3月举办 Future.Industry 2023 全球虚拟大会

Altair&#xff08;纳斯达克股票代码&#xff1a;ALTR&#xff09;近日宣布将于 2023 年 3 月 8 - 9 日 举办年度全球虚拟大会 Future.Industry 2023。旨在探索影响全球未来的新趋势&#xff0c;并深入探讨仿真、高性能计算 (HPC)、人工智能&#xff08;AI&#xff09;和数据分…

使用jenkins+nginx自动化部署前后端项目并打包备份

前言&#xff1a;因为之前使用docker拉取的jenkins无法检测到本地服务器安装的jdk和maven&#xff0c;所以我在本地服务器直接拉取了jenkins&#xff0c;使用8090端口与docker拉取的jenkins进行对比&#xff0c;可以检测到本地服务器安装的jdk和maven&#xff0c;前端和后端分开…

ETHDenver 2023

ETHDenver是全球最大、持续时间最长的以太坊活动之一&#xff0c;今年的活动定于2月24日至3月5日在美国科罗拉多州丹佛市盛大举行。这次活动将面向以太坊和其他区块链协议爱好者、设计者和开发人员。Moonbeam作为ETHDenver 2023的Meta赞助商&#xff0c;将在本次活动中展示令人…

如何使用crAPI学习保护API的安全

关于crAPI crAPI是一个针对API安全的学习和研究平台&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松学习和了解排名前十的关键API安全风险。因此&#xff0c;crAPI在设计上故意遗留了大量安全漏洞&#xff0c;我们可以通过 crAPI学习和研究API安全。 crAPI采用…

如何把照片的底色修改为想要的颜色

如何给照片更换底色&#xff1f;其实有可以一键给照片更换底色的 APP &#xff0c;但是几乎都要收费。如果想要免费的给照片更换底色的话&#xff0c;分享两种简单便捷的方法给你。掌握了这项技能&#xff0c;以后就不用店花钱处理啦&#xff01;1、免费&#xff01;线上快速 给…