分布式任务调度:XXL-Job入门介绍实战

1. 引言

随着互联网业务的不断扩展和复杂化,分布式任务调度成为了构建大规模系统的重要组成部分。XXL-Job作为一款开源的分布式任务调度平台,提供了完整的任务调度和管理功能,被广泛应用于各种场景。本文将介绍如何入门使用XXL-Job,通过实战演示帮助读者快速上手分布式任务调度。

官网:分布式任务调度平台XXL-JOB 

2. Xxl-job介绍

XXL-Job 是一款开源的分布式任务调度平台,由阿里巴巴开发团队提供支持。它提供了完整的任务调度和管理功能,能够帮助用户实现分布式环境下的任务调度、执行和监控。XXL-Job具有轻量、易用、稳定的特点,广泛应用于各种业务场景。

2.1 主要特性
  • 任务管理: 支持任务的新增、编辑、暂停、恢复、删除等操作,提供了丰富的任务管理功能。
  • 分布式执行: 支持分布式部署,任务执行器可以部署在不同的节点上,实现任务的分布式执行。
  • 调度监控: 提供了任务执行情况的监控和统计功能,包括任务执行次数、执行状态、执行日志等信息。
  • 动态调度: 支持任务的动态调度和执行,可以根据实际业务需求灵活调整任务的执行策略和执行时间。
  • 报警机制: 支持任务执行异常时的报警机制,可配置报警方式和报警接收人,及时发现和处理任务执行异常情况。
  • 任务分片: 支持将任务分片执行,提高任务执行效率,同时支持分片广播,确保任务的执行顺序和一致性。
  • 扩展性: 支持自定义任务执行器和调度策略,可以根据业务需求进行灵活扩展和定制。
2.2 架构设计

XXL-Job的架构设计主要包括调度中心、执行器、数据库、消息队列等组件。调度中心负责任务的调度和管理,执行器负责接收调度中心分配的任务并执行,数据库用于存储任务信息和调度规则,消息队列用于调度中心和执行器之间的通信。

引用自官网的架构图

2.3 应用场景

XXL-Job广泛应用于各种业务场景,包括但不限于数据处理和计算任务调度、定时任务调度、异步任务调度、实时任务调度等。它能够帮助用户实现任务的统一调度和管理,提高系统的稳定性和可靠性。

3. 快速开始

3.1 下载安装

首先,从XXL-Job的官方网站下载最新版本的发布包,并解压到本地目录。这里演示以源码的方式启动,其他方式可以参考官网文档:

github:GitHub - xuxueli/xxl-job at 2.4.0

3.2 配置数据库

将db目录下的sql文件在mysql里执行初始化xxl所需的表,进入解压后的xxl-job-admin工程,编辑application.properties文件,配置数据库连接信息。

3.3 启动服务

xxl-job-admin目录下执行以下命令启动XXL-Job Admin服务:

4. 创建任务

4.1 登录管理界面

打开浏览器,访问http://localhost:8080/xxl-job-admin,使用默认的管理员账号和密码admin/123456登录。

4.2 新增执行器

在页面上的执行器管理新增,填写AppName,就是代码里定义的

xxl.job.executor.appname=xxl-job-executor-sample

4.3 新增任务

在左侧菜单栏选择“调度中心” -> “任务管理”,点击“新增”按钮,填写任务名称、执行器、执行方式等信息。

其中执行器是自动注册好的,可以在页面上查看执行器的地址(远程调用),JobHandler就是代码中定义的@Xxl-job注解定义的值

5. SpringBoot集成

源码里有springboot集成的demo,下面是截图,其中XxlJobConfig.java是核心类,如果缺少这个,执行器是无法注册到xxl-job上的。


import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * xxl-job config
 *
 * @author xuxueli 2017-04-28
 */
@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @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;


    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        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;
    }
}
5.1 创建执行任务

在项目中创建一个实现IJobHandler接口的执行器类,实现execute方法,编写任务逻辑代码。

@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
    }
}

6. 启动任务

在任务管理界面中选择刚刚创建的任务,点击“启动”按钮,启动配置好的任务。也可以执行一次,可以看到已经调用到本地的任务代码里了。

  
6.1 查看调度日志

7. 总结

通过本文的介绍和实战演示,读者可以快速了解并上手使用 XXL-Job 进行任务调度管理。XXL-Job 提供了简单易用的界面和丰富的功能,能够满足各种任务调度需求,是一款值得推荐的分布式任务调度平台。


更多文章

RabbitMQ入门实战-CSDN博客

presto/trino 入门介绍实战_presto和trino怎么选-CSDN博客

MongoDB入门介绍与实战-CSDN博客

Netty入门与实战教程_netty教程-CSDN博客

Nacos入门介绍与使用_怎么找到nacos的控制台-CSDN博客

ElasticSearch入门介绍和实战-CSDN博客

JMM内存屏障和逃逸分析详解-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【InternLM 实战营笔记】浦语大模型趣味 Demo

大模型及 InternLM 模型简介 1.1 什么是大模型&#xff1f; 大模型通常指的是机器学习或人工智能领域中参数数量巨大、拥有庞大计算能力和参数规模的模型。这些模型利用大量数据进行训练&#xff0c;并且拥有数十亿甚至数千亿个参数。大模型的出现和发展得益于增长的数据量、…

开学季立式学习灯如何选择?六个挑选大路灯窍门让你不掉坑!

很多用户在选择大路灯时&#xff0c;总是优先考虑所谓的大品牌&#xff0c;但这其实是一个很大的误区。要知道&#xff0c;很多知名品牌的基础品质是还行&#xff0c;但是在专业技术地研发和优化上却鲜有成就&#xff0c;根本无法对光线显色度、稳定性等百余项参数进行实测&…

【leetcode】链表的中间节点

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 点击查看题目 思路: slow和fast都初始化为head&#xff0c;之后slow每走1步&#xff0c;fast走2步…

爬虫到底违法吗?你离违法还有多远?

最近&#xff0c;国家依法查处了部分编写爬虫程序&#xff0c;盗取其他公司数据的不良企业。一时间风声鹤唳&#xff0c;关于爬虫程序是否违法的讨论遍布程序员圈子。那么到底编写爬虫程序是否违法呢&#xff1f; 其爬虫下载数据&#xff0c;一般而言都不违法&#xff0c;因为…

华为---RSTP(四)---RSTP的保护功能简介和示例配置

目录 1. 技术背景 2. RSTP的保护功能 3. BPDU保护机制原理和配置命令 3.1 BPDU保护机制原理 3.2 BPDU保护机制配置命令 3.3 BPDU保护机制配置步骤 4. 根保护机制原理和配置命令 4.1 根保护机制原理 4.2 根保护机制配置命令 4.3 根保护机制配置步骤 5. 环路保护机…

MySQL学习笔记5: MySQL表的增删查改 (进阶)

目录 前言1. 数据库约束1.1. 约束类型not null 约束unique 唯一约束default 默认值约束primary key 主键约束foreign key 外键约束 2. 表的设计2.1. 实体之间的关系一对一一对多多对多 3. 新增4. 查询4.1. 聚合查询4.1.1. 聚合函数4.1.2. group by 子句4.1.3. having 4.2. 联合…

马帮ERP与ETL快速同步

马帮ERP介绍 上海马帮科技有限公司&#xff0c;是一家专注于提供全流程跨境电商ERP管理软件解决方案的企业。聚焦服务于各阶段、各领域的跨境电商从业者&#xff0c;旗下包含专业版ERP、亚马逊专用版ERP、东南亚海外版ERP、WMS、云仓、TMS、跨境分销、SCM等产品模块&#xff0c…

基于R语言piecewiseSEM结构方程模型在生态环境领域技术应用

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;可分析系统内变量间的相互关系&#xff0c;并通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、地学、…

2021年下半年教师资格证考试《高中信息技术》题

4.使用某转码软件对一段时长为2分钟的AVI视频进行转码&#xff0c;转码后的视频信息如图4所示&#xff0c;计算存储该视频文件所需的空间大小为&#xff08;C &#xff09;。 A18MB B36MB C60MB D512MB 6.某21位二进制代码100101011010011110101&#xff0c;已知该代码由3个…

【Rust】——结构体struct

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Sora引发安全新挑战,视频还能相信吗?

今年2月&#xff0c;美国人工智能巨头企业OpenAI再推行业爆款Sora&#xff0c;将之前ChatGPT以图文为主的生成式内容全面扩大到视频领域&#xff0c;引发了全球热议&#xff0c;这也是OpenAI首次进军人工智能视频生成领域。 据公司介绍&#xff0c;Sora使用Transformer架构&…

ONLYOFFICE 桌面编辑器 v8.0 更新内容详细攻略

文章目录 引言PDF 表单RTL 支持电子表格中的新增功能Moodle 集成用密码保护 PDF 文件从“开始”菜单快速创建文档本地界面主题下载安装桌面编辑工具总结 引言 官网链接&#xff1a; ONLYOFFICE 官方网址 ONLYOFFICE 桌面编辑器是一款免费的文档处理软件&#xff0c;适用于 Li…

klipper api测试脚本whconsole.py

1、whconsole.py简单介绍 whconsole.py用于测试klipper的对外接口api&#xff0c;其实是连接klipper的uds服务&#xff08;Unix Domain Socket&#xff09;&#xff0c;官方也有介绍API 服务器 - Klipper 文档。 需要注意是的whconsole.py脚本启动不能使用Python3&#xff0c;…

三个简单方法教你电脑屏保怎么关闭!

当我们使用电脑时&#xff0c;为了保护显示器并为其增添一些个性化的元素&#xff0c;很多人会设置电脑屏保。然而&#xff0c;随着时间的推移&#xff0c;有时我们可能会觉得屏保变得多余或者不希望它干扰我们的工作。此时&#xff0c;关闭电脑屏保成为了一种需求。电脑屏保怎…

cannot import name ‘Iterator‘ from ‘torchtext.data‘

在运行Transformer工程的时候&#xff0c;执行如下语句时出现题目中的报错。 from torchtext.data import Iterator 这个问题解决起来比较曲折&#xff0c;记录下来以备后续查阅。 原来的环境安装的是最新的pytorch&#xff0c;2.x版本&#xff0c;而且该环境在另一个大型Tr…

使用 Python 实现一个飞书/微信记账机器人,酷B了!

Python飞书文档机器人 今天的主题是&#xff1a;使用Python联动飞书文档机器人&#xff0c;实现一个专属的记账助手&#xff0c;这篇文章如果对你帮助极大&#xff0c;欢迎你分享给你的朋友、她、他&#xff0c;一起成长。 也欢迎大家留言&#xff0c;说说自己想看什么主题的…

ThreeDWorld(TDW)学习(待更新)

目录 前言 1.TDW 2.transport challenge 总结 前言 因为挑战赛了解到tdw仿真平台。 想了解的请点击&#xff1a; GitHub - threedworld-mit/tdw: ThreeDWorld simulation environment GitHub - chuangg/tdw-transport-challenge-starter-code 1.TDW ThreeDWorld (TDW)是一…

java中开源json处理库介绍

在Java生态系统中&#xff0c;有几个常用的开源库用于处理JSON数据。这些库各有特点&#xff0c;适用于不同的场景。下面我将介绍几个流行的Java JSON处理库&#xff0c;包括它们的基本情况、主要特点和核心API。 Jackson 基本情况 Jackson是一个流行的Java库&…

本地写的Bash脚本,Linux端运行报错:/bin/bash^M: bad interpreter: No such file or directory

背景 在本地写了个Bash Shell脚本&#xff0c;但上传到Linux端后加完权限执行时报错&#xff1a; &#xff08;脚本名&#xff1a;script.sh&#xff09; -bash: ./script.sh: /bin/bash^M: bad interpreter: No such file or directory 分析 这个错误通常是由于脚本文件的行…

LeetCode41题:缺失的第一个正数(python3)

这道题写的时候完全没有思路&#xff0c;看了很久的题解&#xff0c;才总结出来。 class Solution:def firstMissingPositive(self, nums: List[int]) -> int:nums_set set(nums)n len(nums)for i in range(1, n 1):if i not in nums_set:return ireturn n 1