本文是参考官方文档自己实践一次,纯享版,大致也是作者边写博客边去跟着官方文档实现
一、前期准备
1、官网地址
- GitHub地址:
GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)A distributed task scheduling framework.(分布式任务调度平台XXL-JOB) - xuxueli/xxl-jobhttps://github.com/xuxueli/xxl-job
- 文档地址:
分布式任务调度平台XXL-JOBXXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。https://www.xuxueli.com/xxl-job/#%E4%B8%80%E3%80%81%E7%AE%80%E4%BB%8B来到官网GitHub地址克隆xxl-job项目:
git clone https://github.com/xuxueli/xxl-job.git
2、最新版本需要的环境
- Maven3+
- Jdk1.8+
- Mysql8.0+
3、目前最新依赖
https://mvnrepository.com/artifact/com.xuxueli/xxl-job-corehttps://mvnrepository.com/artifact/com.xuxueli/xxl-job-core
<!-- https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.2</version>
</dependency>
二、快速入门
1、初始化“调度数据库”
可以从官方文档的指导中找到对应数据库信息,官网其他信息也需要注意一下:
下面我给出这里的sql,仅作参考:
#
# XXL-JOB
# Copyright (c) 2015-present, xuxueli.
CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci;
use `xxl_job`;
SET NAMES utf8mb4;
CREATE TABLE `xxl_job_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`job_group` int(11) NOT NULL COMMENT '执行器主键ID',
`job_desc` varchar(255) NOT NULL,
`add_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`author` varchar(64) DEFAULT NULL COMMENT '作者',
`alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',
`schedule_type` varchar(50) NOT NULL DEFAULT 'NONE' COMMENT '调度类型',
`schedule_conf` varchar(128) DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型',
`misfire_strategy` varchar(50) NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略',
`executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略',
`executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
`executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
`executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',
`executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',
`executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
`glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',
`glue_source` mediumtext COMMENT 'GLUE源代码',
`glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',
`glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',
`child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',
`trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行',
`trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间',
`trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`job_group` int(11) NOT NULL COMMENT '执行器主键ID',
`job_id` int(11) NOT NULL COMMENT '任务,主键ID',
`executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
`executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
`executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
`executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
`executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
`trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
`trigger_code` int(11) NOT NULL COMMENT '调度-结果',
`trigger_msg` text COMMENT '调度-日志',
`handle_time` datetime DEFAULT NULL COMMENT '执行-时间',
`handle_code` int(11) NOT NULL COMMENT '执行-状态',
`handle_msg` text COMMENT '执行-日志',
`alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
PRIMARY KEY (`id`),
KEY `I_trigger_time` (`trigger_time`),
KEY `I_handle_code` (`handle_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_log_report` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`trigger_day` datetime DEFAULT NULL COMMENT '调度-时间',
`running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',
`suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',
`fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量',
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_logglue` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`job_id` int(11) NOT NULL COMMENT '任务,主键ID',
`glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
`glue_source` mediumtext COMMENT 'GLUE源代码',
`glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',
`add_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_registry` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`registry_group` varchar(50) NOT NULL,
`registry_key` varchar(255) NOT NULL,
`registry_value` varchar(255) NOT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_group` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`app_name` varchar(64) NOT NULL COMMENT '执行器AppName',
`title` varchar(12) NOT NULL COMMENT '执行器名称',
`address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
`address_list` text COMMENT '执行器地址列表,多地址逗号分隔',
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '账号',
`password` varchar(50) NOT NULL COMMENT '密码',
`role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员',
`permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',
PRIMARY KEY (`id`),
UNIQUE KEY `i_username` (`username`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_lock` (
`lock_name` varchar(50) NOT NULL COMMENT '锁名称',
PRIMARY KEY (`lock_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2018-11-03 22:21:31' );
INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '');
INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);
INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock');
commit;
执行sql:
2、编译源码
各个模块详情如下:
3、配置部署“调度中心”
调度中心项目:xxl-job-admin
作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。
调度中心配置:
上面这些信息修改和自己的一致,其中配置信息里面下面两个是需要修改的,端口自定义修改:
### web
server.port=8010
server.servlet.context-path=/xxl-job-admin
### actuator
management.server.base-path=/actuator
management.health.mail.enabled=false
### resources
spring.mvc.servlet.load-on-startup=0
spring.mvc.static-path-pattern=/static/**
spring.web.resources.static-locations=classpath:/static/
启动项目测试:
修改完成后可以启动项目:
访问下面网址查看是否成功:
http://localhost:8010/xxl-job-admin
默认账号密码为:
账号:admin
密码:123456
成功登录管理端网页!
服务器部署:
如果需要部署到服务器需要将此项目打包,然后部署到服务器上面,这里我是使用宝塔进行项目部署,参考下面操作:
部署到服务器需要开启对应的端口,端口和上面你的配置文件的配置有关,还需要初始化数据库,这里我就不演示了。
打包项目还是这几个步骤:
随便放在服务器一个目录:
宝塔部署比较方便,如果想知道比较详细的部署可以看完之前的博客,下面报了个错:
Failed to create parent directories for [/data/applogs/xxl-job/xxl-job-admin.log]
看了一些博客好像说是根目录是不能创建目录的,所以下面修改一下项目的配置
./data/applogs/xxl-job/xxl-job-admin.log
加一个./ ,重新部署
启动成功,访问客户端:
http://ip:8011/xxl-job-admin/
至此“调度中心”项目已经部署成功。
测试执行器:
下面只是测试,如果希望直接实战可以跳到业务代码改造那边
注意配置文件,这个也是很重要的:
1.本地测试
执行器就是设置定时任务的地方,这里我们使用官方文档提供的一个springboot执行器案例去测试:
运行该项目,在admin控制台可以看到:
进入任务管理,编辑任务,下面有个默认的任务,对应的是官方代码里面的一个定时任务,注意保证项目中@XxlJob注解里面的值和admin里面保持一致才能正常使用项目的定时任务,如果需要添加定时任务,只需要在admin控制台中继续添加任务,注意和代码中@XxlJob的值保持一致。
开始执行一次测试
由于我们的执行器目前只注册了一个,默认从执行器管理中获取,所以不填也没事,但是如果你有多个执行器,就去配置一下,因为xxl-job是一个分布式的定时任务管理,可以有很多执行器。
以上是本地测试,admin也是本地的,如果是服务器测试的话,也需要把测试项目部署上去,然后
注意修改下面配置信息,和之前admin一个原理:
2.服务器测试
保证机器地址正确,然后进行测试:
注意不要使用服务器的admin测试本地的执行器,否则就会报错。
三、业务代码改造
其实这里的原理和测试执行器原理是一样的,无非就是把执行器关键配置信息放在业务代码中
1、项目中加入依赖
<!-- https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.2</version>
</dependency>
2、拷贝修改配置文件
这里我将这些配置配置在yml中
xxl:
job:
# xxl_job_admin配置
admin:
addresses: http://???ip:8011/xxl-job-admin
# 认证token
accessToken: default_token
# 执行器
executor:
### xxl-job executor appname
appname: xxl-job-executor-quick
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
address:
### xxl-job executor server-info
ip:
port: 9999
### xxl-job executor log-path
logpath: ./data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
logretentiondays: 30
3、将config拷贝到项目中
4、新建定时任务测试类来测试
package com.quick.task;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* @program: quick-pick
* @description: 测试定时任务类
* @author: bluefoxyu
* @date: 2024-12-25 22:12
**/
@Component
public class testTask {
/**
* <p>
* description: xxl-job第一个测试案例
* </p>
*
* @return: void
* @author: bluefoxyu
* @date: 2024-12-25 22:13:20
*/
@XxlJob(value = "testFirstTask")
public void testFirstTask(){
XxlJobHelper.log("定时任务执行了" + LocalDateTime.now());
}
}
5、去xxl-job-admin上执行器管理上新增执行器
http://服务器ip:8011/xxl-job-admin/
6、新增定时任务进行一次测试
执行一次任务:
至此,定时任务测试成功!