最近项目中要使用定时任务批量读取csv文件,由于指定了xxl-job做为定时任务,所以咱们就开整
下载开源项目
自行选择版本下载,当前最新版本2.4.0
Gitee地址:https://gitee.com/xuxueli0323/xxl-job
导入项目进入idea
项目不是原有项目结构,test-xxl-job是自行测试建立的springboot 项目,稍后会详细介绍,还有自带的示例项目,目前在此结构中已经被干掉。
在修改项目配置过程中 xxl-job-core不用修改
修改admin项目配置文件
在此列举两个必要修改项,数据库连接,和email,其实修改数据库连接即可。email可有可无,其他配置项默认即可
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://ip:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
[email protected]
[email protected]
spring.mail.password=146512Ab
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
数据库配置
xxljob项目,自带文档和sql建表语句,默认数据库mysql,由于本机没有mysql,所以服务器docker安装一个mysql
1、安装docker ...省略,网上有的是
2、下载镜像 我这里直接下载最新版镜像
docker pull mysql
3、启动容器,需要在宿主机(也就是你的服务器)建立log文件、data文件、conf文件,做数据卷映射
MYSQL_ROOT_PASSWORD=root123456 -itd 3218b38490ce
MYSQL_ROOT_PASSWORD=xxxx 指定数据库密码
3218b38490ce 容器id ,这里选择自己的容器id,用我的就报错啦
docker run -p 3306:3306 --name mysql --privileged=true -v /usr/local/docker/mysql/log:/var/log/mysql -v /usr/local/docker/mysql/data:/var/lib/mysql -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root123456 -itd 3218b38490ce
4、进入容器修改权限,刷新即可
-- 修改访问主机以及密码
ALTER USER 'root'@'%' IDENTIFIED BY 'root123456';
-- 刷新权限
FLUSH PRIVILEGES;
5、连接数据库,执行xxl-job自带sql
介绍下几张表
- xxl_job_lock:任务调度锁表;
- xxl_job_group:执行器信息表,维护任务执行器信息;
- xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
- xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
- xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
- xxl_job_log_report:调度日志报表:用户存储XXL-JOB任务调度日志的报表,调度中心报表功能页面会用到;
- xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
- xxl_job_user:系统用户表;
启动项目
万事俱备,开整,启动admin项目
访问http://localhost:自己设定的端口号/xxl-job-admin
默认登录用户名 admin 密码 123456,想改自己进去修改
docker部署admin项目
1、将admin项目打成jar
2、编辑dockerfile文件
FROM openjdk:8-jre-slim
MAINTAINER xuxueli
// 修改时间
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
// 添加jar包
ADD xxl-job-admin-2.4.0.jar app.jar
RUN bash -c 'touch /app.jar'
// 启动命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
将dockerfile和 jar 上传到服务器同一目录,构建镜像
构建镜像
docker build -t xxl-job:2.4.0 .
运行镜像
docker run -d --name=xxl-job -p 10010:10010 -v /usr/local/docker/xxl-job/log:/data/applogs xxl-job:2.4.0
外部浏览器访问
http://shilei.tech:10010/xxl-job-admin
建立测试项目向xxl-job注册
建立springboot项目test-xxl-job
引入xxl-job依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
添加配置
# xxl-job配置
### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://shilei.tech:10010/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=default_token
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-shilei-test
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9700
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=30
添加配置类
package com.tech.testxxljob.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@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() {
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;
}
}
添加任务
package com.tech.testxxljob.task;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;
@Component
public class TestJob {
@XxlJob("shilei-test-job")
public ReturnT<String> myTestJob(){
System.out.println("测试定时任务!!!");
return ReturnT.SUCCESS;
}
}
在页面操作添加执行器,也就是添加自己项目启动的xxl执行器端点
在页面操作任务添加
刚添加的任务的状态是stop,需要手动启动
完活
注意事项
可能执行任务的时候会出现错误
xxl-job remoting error(connect timed out), for url : http://172.20.10.10:9700/run
当出现此错误的时候,是xxl-job程序和web测试程序不在一个网络中导致的,xxl-job部署在服务器,而web测试服务本地启动
最后将test-xxl-job放在xxl-job同一服务器docker部署即可,详细就不再写啦,跟上边部署xxl-job类似,就是改个jar包名