官网地址:https://www.xuxueli.com/xxl-job
XXL-JOB是一个分布式任务调度平台,简单的说就是特定时间完成特定任务,例如定时发送短信,定时通知等。
一、安装
源码下载可以通过github或者gitee
# 下载源码
git clone https://gitee.com/xuxueli0323/xxl-job
cd xxl-job
# 切换分支
git checkout 2.4.0
二、初始化数据库
下载的源码中,数据库脚本保存在doc下,执行数据库脚本文件,即可创建数据表
三、配置文件修改
3.1、application.properties
xxl-job-admin/src/main/resources/application.properties
修改其中关于数据库配置,以及邮箱配置信息,其他信息根据个人情况实际修改即可
3.2、logback.xml
xxl-job-admin/src/main/resources/logback.xml
该配置用于修改日志相关信息,这里主要修改日志存储位置
<property name="log.path" value="/路径/log/xxl-job-admin.log"/>
四、编译打包
使用maven打包,命令如下
mvn install -Dmaven.test.skip=true
打好的jar包位置 /xxl-job-admin/target/xxl-job-admin-2.4.0.jar
五、运行
在打好的jar包目录使用cmd执行命令:
java -jar xxl-job-admin-2.4.0.jar
访问地址 http://localhost:18080/xxl-job-admin/toLogin
默认登录账号 admin/123456
六、SpringBoot集成xxl-job
6.1、添加依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
6.2、配置文件
在配置文件application.yml中配置
xxl:
job:
admin:
#你的xxl-job服务地址信息
addresses: http://localhost:18080/xxl-job-admin
accessToken: default_token
executor:
#你的xxl-job服务中设置的执行器名称
appname: xxl-job-executor-sample
address:
ip: localhost
#执行器手动配置信息中的端口信息
port: 9999
#日志存储位置
logpath: D:\idea\logs\jobhandler
logretentiondays: 30
注意:
1、xxl-job.admin.address是你的xxl-job服务地址;
2、xxl-job.accessToken默认值为default_token;
3、xxl-job.executor.appname是你配置在xxl-job服务中的执行器的AppName;
4、xxl-job.executor.port关键使用是你的xxl-job服务中执行器的注册方式为手动注册时需要指定的服务信息中的端口信息
5、xxl-job.executor.logpath是日志路径
结合xxl-job服务中执行器的配置信息理解
6.3、配置类XxlJobConfig
配置lxx-job的信息,注入XxlJobSpringExecutor
。
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Slf4j
@Configuration
public class XxlJobConfig {
@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() {
log.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;
}
}
6.4、示例方法
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;
import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
public class SampleXxlJob {
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception{
log.info("开始执行任务,{}", LocalDateTime.now());
//模拟执行任务,比如查询所有用户,给用户发送短信
for (int i = 0; i < 5; i++) {
log.info("执行任务: " + i);
// 有关数据库等操作一定要延迟,否则数据库连接资源会瞬间被占满
TimeUnit.SECONDS.sleep(1);
}
}
/**
* 2、分片广播任务
*/
@XxlJob("shardingJobHandler")
public void shardingJobHandler() throws Exception {
// 分片参数
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
log.info("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
// 业务逻辑
for (int i = 0; i < shardTotal; i++) {
if (i == shardIndex) {
log.info("第 {} 片, 命中分片开始处理", i);
} else {
log.info("第 {} 片, 忽略", i);
}
}
}
}
注意注解@XxlJob执行的名称是需要在xxl-job中创建任务时需要使用到的关键信息
6.5、任务调度
任务创建需要任务调度器的存在,因此需要首先创建任务调度器,而任务调度器又和你现在开发的SpringBoot服务先关联,具体信息参考配置文件。
6.6、任务管理
配置好任务后,开启任务执行,就可以通过现在的SpringBoot查看任务执行情况。因为上述测试任务中配置的是demoJobHandler,因此日志打印的结果就是在springboot中demoJobHandler方法中定义的内容
6.7、调度日志
可以查看任务的所有执行日志,可以通过进一步的查看,查询具体日志