一、XXL-JOB概述
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
二、快速入门
2.1 下载Xxl-Job源代码并导入本地并运行
Github地址:
https://github.com/xuxueli/xxl-job
中文文档地址:
https://www.xuxueli.com/xxl-job/
1.下载Xxl-Job源代码,解压缩使用idea导入
2.打开doc,找到sql文件,在mysql中运行该脚本文件
3.打开xxl-job-admin,修改port和数据库配置修改为自己的配置
如果已经正确进行上述配置,可将项目编译打包部署
4.运行xxl-job-admin(xxl-job后台管理,主要方便管理各种各样的任务)
注意:在运行之前,需要把2的sql脚本执行完毕,并修改数据库连接池。
正常启动,调度中心访问地址为:http://localhost:8080/xxl-job-admin(该地址执行器将会使用到,作为回调地址)
效果图,如下所示:
用户名默认为admin
密码为123456
输入后,进入这个界面,如图:
这样就表示Xxl-Job成功运行了。确保运行没问题后,就可以开始下一步。
2.2 添加执行器
Xxl-Job源代码就一个Example,可以复用过来,你也可以选择自己新建项目,新建项目可以在Xxl-Job基础上,也可以放在其它项目中
三、springboot进行整合
3.1 添加依赖
如果使用maven仓库:
pom:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
如果使用gradle仓库:
implementation('com.xuxueli:xxl-job-core:2.3.0')
3.2 配置yml
xxl:
job:
accessToken:
admin:
addresses: http://127.0.0.1:8080/xxl-job-admin
executor:
appname: xxl-job-executor-sample/
ip:
port: 9900
logpath: /var/log/hwariot/hwariot-mixing-station-data/xxl-job/jobhandler/
logretentiondays: -1
accessToken:执行器通讯[选填],非空时启用
addresses:调度中心地址[选填],如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调",为空则关闭自动注册
appname:执行器 [选填],执行器心跳注册分组依据,为空则关闭自动注册
ip:默认为空表示自动获取,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用,地址信息用于 “执行器注册” 和
“调度中心请求并触发任务”port:执行器端口号 [选填],小于等于0则自动获取,默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口
logpath:执行器运行日志文件存储磁盘路径 [选填] ,需要对该路径拥有读写权限,为空则使用默认路径
logretentiondays:执行器日志保存天数 [选填] ,值大于3时生效,启用执行器Log文件定期清理功能,否则不生效
3.3 执行器配置
- 执行器组件配置信息位置:/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java
package com.hwariot.api.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.commons.util.InetUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
/**
* hwariot-job config
*
* @author xuxueli 2017-04-28
*/
@Configuration
@ComponentScan(basePackages = "com.hwariot.api.task")
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appName;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Resource
private InetUtils inetUtils;
// @Bean(initMethod = "start", destroyMethod = "destroy")
@Bean
public XxlJobSpringExecutor hwariotJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appName);
if (StringUtils.isBlank(ip)) {
ip = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
}
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
注意:
在低版本的 xxl-job 中, 初始化 XxlJobSpringExecutor 执行器需要在 @Bean 中加上 initMethod = “start”, destroyMethod = “destroy”。
但是在高版本的 xxl-job(如 2.3.0)则需要删除 initMethod = “start”, destroyMethod = “destroy”
3.4 这时配置已经做好了,可以编写定时任务了
package com.hwariot.api.task;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* xxl-job开发示例
* @author qzz
*
* 开发步骤:
* * 1、任务开发:在Spring Bean实例中,开发Job方法;
* * 2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
* * 3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
* * 4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;
* *
*/
@Component
@Slf4j
public class TestHandler {
@XxlJob(value = "TestHandler")
public boolean demoJobHandler(){
log.info("定时任务开始 job start");
Long startTime = System.currentTimeMillis();
testHandler();
Long endTime = System.currentTimeMillis();
log.info("定时任务开始 job end, cost: {} ms"+(endTime - startTime));
return XxlJobHelper.handleSuccess();
}
/**
* 定时任务要执行的业务逻辑
*/
public void testHandler() {
System.out.println("hello world");
}
}
3.5 启动项目
四、结合Xxl-Job后台系统增加定时任务
4.1 配置执行器
执行器地址为(与application.yml配置文件里的执行器地址需要保持一致,否则会注册失败,导致任务执行不了。
4.2 添加任务
4.3 执行
可以点击“执行一次”,也可以点击“启动”实时执行。
任务执行成功的标志:
到这里,spring boot整合xxl-job已经可以上线使用了
五、问题总结
5.1 xxl-job-admin 启动失败
失败原因:ERROR c.x.job.core.util.XxlJobRemotingUtil - Connection refused: connect
解决方法:我们切换下启动类,就可以正常启动了
5.2 项目启动报Command line is too long
报错:Error running ‘Application‘: Command line is too long. Shorten comm
解决方法:
1.选择报错的启动类,然后在Edit Configurations中找到他
2.展开Environment,Shorten command line 选择 JAR manifest,点击Apply,再点击OK.
此时即可正常启动。
5.3 项目启动报错:Exception in thread “Thread-13” java.net.BindException: Address already in use: bind
看起来像是地址被占用,实际是新版本配置类中不需要在Bean中加属性了,直接注释@Bean即可