Bootstrap

xxl-job整合 docker 部署

最近项目中要使用定时任务批量读取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;

传送门:docker安装mysql8完整版

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包名

;