• 概述

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

官方地址中文版:http://www.xuxueli.com/xxl-job目前已有多家公司接入xxl-job,包括比较知名的大众点评,京东,优信二手车,北京尚德,360金融 (360),联想集团 (联想),易信 (网易)等等....

9eb9242792fdf2eef71ca8f14734c44a.png

  • 特性

1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;

2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;

3、调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA;

4、执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA;

5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;

6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;

7、触发策略:提供丰富的任务触发策略,包括:Cron触发、固定间隔触发、固定延时触发、API(事件)触发、人工触发、父子任务触发;

8、调度过期策略:调度中心错过调度时间的补偿处理策略,包括:忽略、立即补偿触发一次等;

9、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;

10、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务;

......

  • 快速入门

源码仓库地址:https://github.com/xuxueli/xxl-job

1.初始化调度数据库

下载项目源码并解压,获取 "调度数据库初始化SQL脚本" 并执行即可。

"调度数据库初始化SQL脚本" 位置为:

/xxl-job/doc/db/tables_xxl_job.sql

调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例;

如果mysql做主从,调度中心集群节点务必强制走主库;

2.编译源码

解压源码,按照maven格式将源码导入IDE, 使用maven进行编译即可,源码结构如下:

xxl-job-admin:调度中心xxl-job-core:公共依赖xxl-job-executor-samples:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)    :xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式;    :xxl-job-executor-sample-spring:Spring版本,通过Spring容器管理执行器,比较通用;    :xxl-job-executor-sample-frameless:无框架版本;    :xxl-job-executor-sample-jfinal:JFinal版本,通过JFinal管理执行器;    :xxl-job-executor-sample-nutz:Nutz版本,通过Nutz管理执行器;    :xxl-job-executor-sample-jboot:jboot版本,通过jboot管理执行器;

修改xxl-job-admin项目中的application.properties文件中的数据库连接信息和邮件信息,其中定时任务出错的时候会发送邮件,提示报错。

a4f168a1f939408e82b342e11e3b528c.png

之后启动xxl-job-admin项目,启动成功后浏览器输入http://localhost:8080/xxl-job-admin/toLogin,其中端口和项目名称在xxl-job-admin的application.properties文件中:

25533f43c5f0de86eac1c880bfbfeb64.png

输入用户名密码:默认为admin/123456

c81ff780a4fb6bedb18f401685b97041.png

3.集成现有项目

引入xxl-job-core依赖

    <dependency>      <groupId>com.xuxueligroupId>      <artifactId>xxl-job-coreartifactId>      <version>2.2.0version>  dependency>

application.yml文件

server:  #项目端口号  port: 8081xxl:  job:    admin:      #调度中心部署地址:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"。      addresses: http://127.0.0.1:8080/xxl-job-admin    #分别配置执行器的名称、ip地址、端口号     注意:如果配置多个执行器时,防止端口冲突    executor:      appname: executorDemo      address:      ip:      port: 9999      #执行器运行日志文件存储的磁盘位置,需要对该路径拥有读写权限      logpath: /data/applogs/xxl-job/jobhandler      #执行器Log文件定期清理功能,指定日志保存天数,日志文件过期自动删除。限制至少保持3天,否则功能不生效;-1表示永不删除      logretentiondays: -1    accessToken:

xxljob配置类

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

新建自己的任务

/** * 任务Handler示例(Bean模式) *  * 开发步骤: * 1、在Spring Bean实例中,开发Job方法,方式格式要求为 "public ReturnT execute(String param)" * 2、为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。 */@Componentpublic class DemoHandler{    private static Logger log = LoggerFactory.getLogger(DemoHandler.class);    @XxlJob("demoJobHandler")    public ReturnTexecuteJob(String param) throws Exception {        XxlJobLogger.log("DemoHandler start");//通过 XxlJobLogger.log()将日志打印到任务调度中心日志中        log.info("DemoHandler start");        System.err.println("==========================================================>>>>>>>>>>>>>" + param);        return ReturnT.SUCCESS;    }}

在调度中心配置执行器

7fcf5c35d47cec8a19321038b513aea5.png

在调度中心新建任务

f15c2ac2a23dc0131a80f4872dfc5d73.png

输入cron表达式,jobhandler,报警邮箱。

启动项目,启动调度任务

bf81a10175356f742641f3aa91b94f1b.png

控制台打印

053a8f72822d2ac97577d2873078f3fe.png

查看调度日志

e97495403a2f20fcc99ef8306de17866.png

执行日志(通过 XxlJobLogger.log()打印)

be2008b77142c86115190fcf302fbb4d.png

现在将服务停掉

ed4cb3a572980d47506a665fcfdc2376.png

0f10b3c630be28e777f5c1974b04da85.png

触发报警邮箱。

  • 总结-

xxlJob与Spring Boot原生定时器的区别:

前面我们写了一篇原生定时器SpringBoot之定时任务

先来简单总结下xxljob是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。@Scheduled是Spring boot自带的原生的执行器。可以作为一个触发源添加到一个方法中。虽然两者都能在固定的时间进行任务调度,但是有没有注意到,xxljob的重点有一个分布式,而@Scehduled并没有提到这一点。那拥有分布式的xxljob有什么优点?

1.可靠性(容错):一台服务器的系统崩溃并不影响到其余的服务器。

2.可扩展性:在分布式计算系统可以根据需要增加更多的机器。

3.资源共享:能够共享数据。

4.更高的性能:相较于集中式计算机网络集群可以提供更高的性能。

......

通过上面我们知道具有三高(高可用、高性能、高并发)的xxljob优点有很多。

那具体的xxljob和@Scheduled区别是什么?

假如有一个场景。一个系统需要同一时间执行很多服务调度来实现一个功能,这时你部署在一台服务器上就不行了。你可以将这些服务调度部署在一个xxljob分布式调度平台上,每个服务都有对应的job。每天固定的时间就会固定执行。那有人是不是会想我将使用@Schedule作为定时器的服务也部署在多个服务器上不也可以吗?虽说这个xxljob分布式调度平台是由一个集群搭建完成的,但是它可以同一时间执行多个job不会重复,对执行的服务进行加锁处理。而不是分布式的集群在定时执行服务时无法确定我执行的这个服务是否在另一台服务器上已经执行。

北漂Java 程序员一枚,喜欢就点个关注吧。

                     

ec88de59af6a4a63f76d58fb754f2f4c.png

ad55a09275b57bd4148f9110df462857.gif

往期精选

SpringCloud配置中心的使用SpringCloud-Eureka高可用搭建SpringCloud-Zuul服务网关SpringCloud-Ribbon负载均衡SpringCloud-Feign远程调用SpringCloud-Hystrix解决雪崩SpringCloud-Bus消息总线Springboot 自定义注解实现日志功能Nacos入门案例
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐