全文目录, 一篇结束
1. 前言简介
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
1.1 xxl-job的作用及优势
1.1.1 xxl-job作用
统一管理定时调度任务 相比于 springboot的@Scheduled , 这个表达式可以随意修改 也可以面对更加复杂的定时调度场景 如
集群
,
容错
,
分片
等等
1.1.2 xxl-job优势
1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
3、调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA;
4、执行器HA(分布式):任务分布式执行,任务”执行器”支持集群部署,可保证任务执行HA;
5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
7、触发策略:提供丰富的任务触发策略,包括:Cron触发、固定间隔触发、固定延时触发、API(事件)触发、人工触发、父子任务触发;
8、调度过期策略:调度中心错过调度时间的补偿处理策略,包括:忽略、立即补偿触发一次等;
9、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
10、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务;
等等等
1.2 资源位置及使用说明
1.2.1 文档说明
=> 传送门: xxl的使用文档
1.2.2 docker镜像位置
=> 传送门: docker镜像xxl-job 2.4.0
2. 安装配置使用xxl-job(两种)
2.0 公共操作: sql脚本(2.2免下载也用)
源码中:
/xxl-job/doc/db/tables_xxl_job.sql
CREATEdatabaseifNOTEXISTS`xxl_job`defaultcharacterset utf8mb4 collate utf8mb4_general_ci;use`xxl_job`;SET NAMES utf8mb4;CREATETABLE`xxl_job_info`(`id`int(11)NOTNULLAUTO_INCREMENT,`job_group`int(11)NOTNULLCOMMENT'执行器主键ID',`job_desc`varchar(255)NOTNULL,`add_time`datetimeDEFAULTNULL,`update_time`datetimeDEFAULTNULL,`author`varchar(64)DEFAULTNULLCOMMENT'作者',`alarm_email`varchar(255)DEFAULTNULLCOMMENT'报警邮件',`schedule_type`varchar(50)NOTNULLDEFAULT'NONE'COMMENT'调度类型',`schedule_conf`varchar(128)DEFAULTNULLCOMMENT'调度配置,值含义取决于调度类型',`misfire_strategy`varchar(50)NOTNULLDEFAULT'DO_NOTHING'COMMENT'调度过期策略',`executor_route_strategy`varchar(50)DEFAULTNULLCOMMENT'执行器路由策略',`executor_handler`varchar(255)DEFAULTNULLCOMMENT'执行器任务handler',`executor_param`varchar(512)DEFAULTNULLCOMMENT'执行器任务参数',`executor_block_strategy`varchar(50)DEFAULTNULLCOMMENT'阻塞处理策略',`executor_timeout`int(11)NOTNULLDEFAULT'0'COMMENT'任务执行超时时间,单位秒',`executor_fail_retry_count`int(11)NOTNULLDEFAULT'0'COMMENT'失败重试次数',`glue_type`varchar(50)NOTNULLCOMMENT'GLUE类型',`glue_source`mediumtextCOMMENT'GLUE源代码',`glue_remark`varchar(128)DEFAULTNULLCOMMENT'GLUE备注',`glue_updatetime`datetimeDEFAULTNULLCOMMENT'GLUE更新时间',`child_jobid`varchar(255)DEFAULTNULLCOMMENT'子任务ID,多个逗号分隔',`trigger_status`tinyint(4)NOTNULLDEFAULT'0'COMMENT'调度状态:0-停止,1-运行',`trigger_last_time`bigint(13)NOTNULLDEFAULT'0'COMMENT'上次调度时间',`trigger_next_time`bigint(13)NOTNULLDEFAULT'0'COMMENT'下次调度时间',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLE`xxl_job_log`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`job_group`int(11)NOTNULLCOMMENT'执行器主键ID',`job_id`int(11)NOTNULLCOMMENT'任务,主键ID',`executor_address`varchar(255)DEFAULTNULLCOMMENT'执行器地址,本次执行的地址',`executor_handler`varchar(255)DEFAULTNULLCOMMENT'执行器任务handler',`executor_param`varchar(512)DEFAULTNULLCOMMENT'执行器任务参数',`executor_sharding_param`varchar(20)DEFAULTNULLCOMMENT'执行器任务分片参数,格式如 1/2',`executor_fail_retry_count`int(11)NOTNULLDEFAULT'0'COMMENT'失败重试次数',`trigger_time`datetimeDEFAULTNULLCOMMENT'调度-时间',`trigger_code`int(11)NOTNULLCOMMENT'调度-结果',`trigger_msg`textCOMMENT'调度-日志',`handle_time`datetimeDEFAULTNULLCOMMENT'执行-时间',`handle_code`int(11)NOTNULLCOMMENT'执行-状态',`handle_msg`textCOMMENT'执行-日志',`alarm_status`tinyint(4)NOTNULLDEFAULT'0'COMMENT'告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',PRIMARYKEY(`id`),KEY`I_trigger_time`(`trigger_time`),KEY`I_handle_code`(`handle_code`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLE`xxl_job_log_report`(`id`int(11)NOTNULLAUTO_INCREMENT,`trigger_day`datetimeDEFAULTNULLCOMMENT'调度-时间',`running_count`int(11)NOTNULLDEFAULT'0'COMMENT'运行中-日志数量',`suc_count`int(11)NOTNULLDEFAULT'0'COMMENT'执行成功-日志数量',`fail_count`int(11)NOTNULLDEFAULT'0'COMMENT'执行失败-日志数量',`update_time`datetimeDEFAULTNULL,PRIMARYKEY(`id`),UNIQUEKEY`i_trigger_day`(`trigger_day`)USINGBTREE)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLE`xxl_job_logglue`(`id`int(11)NOTNULLAUTO_INCREMENT,`job_id`int(11)NOTNULLCOMMENT'任务,主键ID',`glue_type`varchar(50)DEFAULTNULLCOMMENT'GLUE类型',`glue_source`mediumtextCOMMENT'GLUE源代码',`glue_remark`varchar(128)NOTNULLCOMMENT'GLUE备注',`add_time`datetimeDEFAULTNULL,`update_time`datetimeDEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLE`xxl_job_registry`(`id`int(11)NOTNULLAUTO_INCREMENT,`registry_group`varchar(50)NOTNULL,`registry_key`varchar(255)NOTNULL,`registry_value`varchar(255)NOTNULL,`update_time`datetimeDEFAULTNULL,PRIMARYKEY(`id`),KEY`i_g_k_v`(`registry_group`,`registry_key`,`registry_value`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLE`xxl_job_group`(`id`int(11)NOTNULLAUTO_INCREMENT,`app_name`varchar(64)NOTNULLCOMMENT'执行器AppName',`title`varchar(12)NOTNULLCOMMENT'执行器名称',`address_type`tinyint(4)NOTNULLDEFAULT'0'COMMENT'执行器地址类型:0=自动注册、1=手动录入',`address_list`textCOMMENT'执行器地址列表,多地址逗号分隔',`update_time`datetimeDEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLE`xxl_job_user`(`id`int(11)NOTNULLAUTO_INCREMENT,`username`varchar(50)NOTNULLCOMMENT'账号',`password`varchar(50)NOTNULLCOMMENT'密码',`role`tinyint(4)NOTNULLCOMMENT'角色:0-普通用户、1-管理员',`permission`varchar(255)DEFAULTNULLCOMMENT'权限:执行器ID列表,多个逗号分割',PRIMARYKEY(`id`),UNIQUEKEY`i_username`(`username`)USINGBTREE)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLE`xxl_job_lock`(`lock_name`varchar(50)NOTNULLCOMMENT'锁名称',PRIMARYKEY(`lock_name`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;INSERTINTO`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');INSERTINTO`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','');INSERTINTO`xxl_job_user`(`id`,`username`,`password`,`role`,`permission`)VALUES(1,'admin','e10adc3949ba59abbe56e057f20f883e',1,NULL);INSERTINTO`xxl_job_lock`(`lock_name`)VALUES('schedule_lock');commit;
2.1 方法一: 源码搭建方式
2.1.1 源码下载位置
=> 传送门: github仓库地址:
=> 传送门: gitee仓库地址
2.1.2 idea找到admin并发包
xxl-job-admin: 任务调度中心 就这个最关键
xxl-job-executor-samples 忽略 测试功能 本来就挺简单 看这个没啥必要
2.1.3 找到application.properties
主要修改mysql的参数
### 服务部署的端口,server.port=8080
server.servlet.context-path=/xxl-job-admin
###调度中心JDBC链接:链接地址和之前所创建的调度数据库的地址一致spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
## 调度线程池最大线程配置【必填】xxl.job.triggerpool.fast.max=200xxl.job.triggerpool.slow.max=100### 调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能;xxl.job.logretentiondays=30
2.1.4 maven打包生成jar文件
mvn clean compile package install
2.2 方法二: docker制作镜像(*)
2.2.1 docker拉取配置
docker pull xuxueli/xxl-job-admin:2.4.0
2.2.2 docker镜像创建并运行
-> (1) 运行命令
docker run -di-ePARAMS="--spring.datasource.url=jdbc:mysql://192.168.1.29:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 --spring.datasource.username=root --spring.datasource.password=pzy123 --xxl.job.accessToken=pingzhuyan.test"\-p9001:8080 \-v /usr/local/src/docker/xxl-job:/data/applogs \--name xxl-job \--privileged=true \
xuxueli/xxl-job-admin:2.4.0
-> (2) 参数解释
--privileged=true
container内的root拥有
真正的root
权限
-v 目录挂载 这里实际是两层xxl-job 也就是可以不写xxl-job文件
-p 端口 左边宿主机 右边容器
–xxl.job.accessToken=pingzhuyan.testaccessToken
后面有用(上面就在配置文件内改)
2.3 查看启动结果
2.3.1 直接访问地址
2.3.2 如遇访问异常
(打开防火墙端口) systemctl操作
2.3.3 检查服务启动是否正常
数据库报错 改数据库信息
文件没权限 增加root权限
2.3.4 docker操作的相关指令
docker相关操作专栏 ===> 传送门
上面专栏内 记载了docker相关的操作
, 感兴趣的可以看一看
# 查看日志docker container logs xxl-job
# 查看所有容器dockerps-a# 删除容器docker container rm-f xxl-job
# 删除images镜像docker images rmi -f 镜像id
# 进入容器bash操作dockerexec-it xxl-job bash# 重启服务docker restart xxl-job
3. springboot整合xxl-job(新版2.4.0)
版本
2.3.0-2.4.0
写法变化不大
3.1 配置文件
3.1.1 yml配置代码
xxl:job:admin:# 调度中心服务部署的地址addresses: http://192.168.1.29:9001/xxl-job-admin
# 执行器通讯TOKEN,要和调度中心服务部署配置的accessToken一致,要不然无法连接注册accessToken: pingzhuyan.test
executor:# 执行器AppNameappname: pzy-beta1
# 执行器注册 [选填] address:ip:#执行器端口号: 小于等于0则自动获取 默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;port:0# 执行器运行日志文件存储磁盘路径 [选填] 需要对该路径拥有读写权限;为空则使用默认路径;logpath: D:/usr/local/src/xxl-job
# 执行器日志文件保存天数 [选填] 过期日志自动清理, 限制值大于等于3时生效 否则, 如-1, 关闭自动清理功能logretentiondays:15
3.1.2 properties配置文件
### 调度中心的地址 ,就是 xxl-job-admin 这个服务的地址xxl.job.admin.addresses=http://192.168.1.29:9001/xxl-job-admin
### 要和xxl-job-admin 中的accessToken统一 (可以没有)xxl.job.accessToken=pingzhuyan.test
### 执行器名称,可自定义xxl.job.executor.appname=pzy-beta1
### 会将该地址注册到调度中心,调度中心会用该地址调度任务, 可为空默认就是 ip:port , 端口不可以和业务端口重复xxl.job.executor.address=### 可为空,默认获取本机ipxxl.job.executor.ip=xxl.job.executor.port=0### 运行日志所保存的路径xxl.job.executor.logpath=D:/usr/local/src/xxl-job
### 日志存放时间xxl.job.executor.logretentiondays=15
3.2 配置中部分参数解释
3.2.1 调度中心地址
调度中心
服务部署
的地址
*** ps: 不要公网部署 内网测试 还得用内网穿透麻烦
3.2.2 accessToken由来
docker创建的时候有个参数
--xxl.job.accessToken=pingzhuyan.test
作用:
执行器通讯TOKEN,要和调度中心服务部署配置的accessToken一致,要不然无法连接注册
如
下图
所示:
3.2.3 执行器名称由来
如图所示 新增执行器 复制appName
3.2.4 注册地址 ip 及 端口解释
- 优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
端口
必填 0自动分配默认9999
集群启动时候 这个端口写固定会启动失败
3.2.5 logpath运行日志保存位置[选填]
windows
下这个路径如图所示, 每次执行都会留下日志文件
3.2.6 logretentiondays日志存放时间[选填]
过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能
3.3 springboot代码整合
3.3.1 配置config的写法
XxlJobSpringExecutor
这块大同小异, 写法都差不多 bean模式的
最下面注释的XxlJobExecutor.registJobHandler("pzyBetaHandler", new TaskDispatch());
是整个类进行定时任务 模式是GLUE(java)
不能Autowired
只能new
importcom.xxl.job.core.executor.impl.XxlJobSpringExecutor;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;/**
* @author pzy
* @version 0.1.0
*/@Configuration@Slf4jpublicclassXxlJobConfig{@Value("${xxl.job.admin.addresses}")privateString adminAddresses;@Value("${xxl.job.accessToken}")privateString accessToken;@Value("${xxl.job.executor.appname}")privateString appname;@Value("${xxl.job.executor.address}")privateString address;@Value("${xxl.job.executor.ip}")privateString ip;@Value("${xxl.job.executor.port}")privateint port;@Value("${xxl.job.executor.logpath}")privateString logPath;@Value("${xxl.job.executor.logretentiondays}")privateint logRetentionDays;@BeanpublicXxlJobSpringExecutorxxlJobExecutor(){
log.info("===> pzy xxl-job Bean执行开始");XxlJobSpringExecutor xxlJobSpringExecutor =newXxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
log.info("===> pzy xxl-job Bean执行成功");// XxlJobExecutor.registJobHandler("pzyBetaHandler", new TaskDispatch());return xxlJobSpringExecutor;}}
3.3.2 测试代码(bean模式)
importcom.xxl.job.core.handler.annotation.XxlJob;importorg.springframework.stereotype.Component;/**
* @author pzy
* @version 0.1.0
*/@ComponentpublicclassTestTask{@XxlJob("pzyBetaHandler")publicvoidpzyBetaHandler()throwsException{System.out.println("hello---->xxl-job");// default success}}
3.3.3 官方测试代码(新版3.4.0)
旧版本的百度搜一下一大堆, 具体看
本文目录:4.2.1
详解
importcom.xxl.job.core.biz.model.ReturnT;importcom.xxl.job.core.context.XxlJobHelper;importcom.xxl.job.core.handler.annotation.XxlJob;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.stereotype.Component;importjava.io.BufferedInputStream;importjava.io.BufferedReader;importjava.io.DataOutputStream;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;importjava.net.URL;importjava.util.Arrays;importjava.util.concurrent.TimeUnit;/**
* 一个开发示例 已经更新为2.4.0新版了
*
* XxlJob开发示例(Bean模式)
* <p>
* 开发步骤:
* 1、在Spring Bean实例中,开发Job方法,方式格式要求为 "public ReturnT<String> execute(String param)"
* 2、为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
* 3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
*
* @author xuxueli 2019-12-11 21:52:51
*/@ComponentpublicclassSampleXxlJob{privatestaticLogger logger =LoggerFactory.getLogger(SampleXxlJob.class);/**
* 1、简单任务示例(Bean模式)
*/@XxlJob("demoJobHandler")publicReturnT<String>demoJobHandler(String param)throwsException{XxlJobHelper.log("XXL-JOB, Hello World.");for(int i =0; i <5; i++){XxlJobHelper.log("beat at:"+ i);TimeUnit.SECONDS.sleep(2);}returnReturnT.SUCCESS;}/**
* 2、分片广播任务
*/@XxlJob("shardingJobHandler")publicReturnT<String>shardingJobHandler(String param)throwsException{// 分片参数// ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo(); 2.3.0 更新了XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}",XxlJobHelper.getShardIndex(),XxlJobHelper.getShardTotal());// 业务逻辑for(int i =0; i <XxlJobHelper.getShardTotal(); i++){if(i ==XxlJobHelper.getShardIndex()){XxlJobHelper.log("第 {} 片, 命中分片开始处理", i);}else{XxlJobHelper.log("第 {} 片, 忽略", i);}}returnReturnT.SUCCESS;}/**
* 3、命令行任务
*/@XxlJob("commandJobHandler")publicReturnT<String>commandJobHandler(String param)throwsException{String command = param;int exitValue =-1;BufferedReader bufferedReader =null;try{// command processProcess process =Runtime.getRuntime().exec(command);BufferedInputStream bufferedInputStream =newBufferedInputStream(process.getInputStream());
bufferedReader =newBufferedReader(newInputStreamReader(bufferedInputStream));// command logString line;while((line = bufferedReader.readLine())!=null){XxlJobHelper.log(line);}// command exit
process.waitFor();
exitValue = process.exitValue();}catch(Exception e){XxlJobHelper.log(e);}finally{if(bufferedReader !=null){
bufferedReader.close();}}if(exitValue ==0){returnReturnT.SUCCESS;}else{returnnewReturnT<String>(ReturnT.FAIL.getCode(),"command exit value("+ exitValue +") is failed");}}/**
* 4、跨平台Http任务
* 参数示例:
* "url: http://www.baidu.com\n" +
* "method: get\n" +
* "data: content\n";
*/@XxlJob("httpJobHandler")publicReturnT<String>httpJobHandler(String param)throwsException{// param parseif(param ==null|| param.trim().length()==0){XxlJobHelper.log("param["+ param +"] invalid.");returnReturnT.FAIL;}String[] httpParams = param.split("\n");String url =null;String method =null;String data =null;for(String httpParam : httpParams){if(httpParam.startsWith("url:")){
url = httpParam.substring(httpParam.indexOf("url:")+4).trim();}if(httpParam.startsWith("method:")){
method = httpParam.substring(httpParam.indexOf("method:")+7).trim().toUpperCase();}if(httpParam.startsWith("data:")){
data = httpParam.substring(httpParam.indexOf("data:")+5).trim();}}// param validif(url ==null|| url.trim().length()==0){XxlJobHelper.log("url["+ url +"] invalid.");returnReturnT.FAIL;}if(method ==null||!Arrays.asList("GET","POST").contains(method)){XxlJobHelper.log("method["+ method +"] invalid.");returnReturnT.FAIL;}// requestHttpURLConnection connection =null;BufferedReader bufferedReader =null;try{// connectionURL realUrl =newURL(url);
connection =(HttpURLConnection) realUrl.openConnection();// connection setting
connection.setRequestMethod(method);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setReadTimeout(5*1000);
connection.setConnectTimeout(3*1000);
connection.setRequestProperty("connection","Keep-Alive");
connection.setRequestProperty("Content-Type","application/json;charset=UTF-8");
connection.setRequestProperty("Accept-Charset","application/json;charset=UTF-8");// do connection
connection.connect();// dataif(data !=null&& data.trim().length()>0){DataOutputStream dataOutputStream =newDataOutputStream(connection.getOutputStream());
dataOutputStream.write(data.getBytes("UTF-8"));
dataOutputStream.flush();
dataOutputStream.close();}// valid StatusCodeint statusCode = connection.getResponseCode();if(statusCode !=200){thrownewRuntimeException("Http Request StatusCode("+ statusCode +") Invalid.");}// result
bufferedReader =newBufferedReader(newInputStreamReader(connection.getInputStream(),"UTF-8"));StringBuilder result =newStringBuilder();String line;while((line = bufferedReader.readLine())!=null){
result.append(line);}String responseMsg = result.toString();XxlJobHelper.log(responseMsg);returnReturnT.SUCCESS;}catch(Exception e){XxlJobHelper.log(e);returnReturnT.FAIL;}finally{try{if(bufferedReader !=null){
bufferedReader.close();}if(connection !=null){
connection.disconnect();}}catch(Exception e2){XxlJobHelper.log(e2);}}}/**
* 5、生命周期任务示例:任务初始化与销毁时,支持自定义相关逻辑;
*/@XxlJob(value ="demoJobHandler2", init ="init", destroy ="destroy")publicReturnT<String>demoJobHandler2(String param)throwsException{XxlJobHelper.log("XXL-JOB, Hello World.");returnReturnT.SUCCESS;}publicvoidinit(){
logger.info("init");}publicvoiddestroy(){
logger.info("destory");}}
4. 总结及注意事项
4.1 本文总结
- 找到文档和代码位置
- 创建数据库
- 拉取镜像
- 运行容器
- 打开 http://192.168.1.100:9001/xxl-job-admin
- 输入admin 123456
- 创建执行器
- 创建任务管理(选择bean模式) 记住bean的名字
- 在springboot工程中加入依赖(
最新版的2.4.0
)- 添加配置yml/properties
- 写配置文件(上面的写不写都行 就是取个参数)
- 书写测试代码@XxlJob(“
记住的bean的名字
”)- 启动程序并在xxl-job-admin测试运行
- 一切正常 测试集群效果
到此结束
4.2 注意事项
4.2.1 新版本2.3.0版本+的写法有变化
- 2.3.0版本修改使用方式了 用老版本的看一下 2.3.1 测试代码@XxlJob即使是灰色 不用理会
到此xxl-job全部结束 使用起来比较简单 管理起来也比较方便 集群部署也很容易
作者: pingzhuyan
版权归原作者 pingzhuyan 所有, 如有侵权,请联系我们删除。