目录

xxl-job部署在docker-destop,实现定时发送预警信息给指定邮箱

xxl-job部署在docker-destop,实现定时发送预警信息给指定邮箱

XXL-JOB

XXL-JOB是一个分布式任务调度平台(XXL是作者徐雪里姓名拼音的首字母),其核心设计目标是开发迅速、学习简单、轻量级、易扩展。

源码仓库地址:

源码结构: https://i-blog.csdnimg.cn/direct/f47acf746fa4417099daf53bc06b76d2.png

系统架构

在xxl-job中,有2个角色:

  • xxl-job-admin调度中心

    统一管理任务调度平台上的调度任务,负责触发调度执行,并且提供任务管理平台。

  • xxl-job-executor执行器

    执行器通常是我们的业务系统,如示例中的springboot项目。

  • xxl-job就是一个中心化管理系统,系统主要通过MySQL管理各种定时任务信息,当到了定时任务的触发时间,就把任务信息从数据库中拉进内存,对任务执行器发起调度请求。

1.首先拉取xxl-job镜像

docker run --restart=always --privileged=true -e PARAMS="--spring.datasource.username=root --spring.datasource.password=123456--spring.datasource.url=jdbc:mysql://192.168.2.3:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai" -p 8040:8080 -v /usr/local/docker/xxl-job/logs:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin:2.4.0

注意所连接的数据库xxl_job的权限要为%,并且允许所有ip连接

检查C:\ProgramData\MySQL\MySQL Server 8.0的my.ini文件

https://i-blog.csdnimg.cn/direct/65305055e0a14eaaa11e6b4fa0ec914a.png

也可以通过docker-compose.yml文件拉取

version: '3.3'
services:
  xxl-job-admin:
    image: xuxueli/xxl-job-admin:2.4.1
    ports:
      - "8040:8080"
    environment:
      PARAMS: '
        --spring.datasource.url=jdbc:mysql://192.168.2.3:3306/xxl_job?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
        --spring.datasource.username=root
        --spring.datasource.password=123456
        --xxl.job.accessToken=xxl-job'
    volumes:
      - ./logs:/data/applogs

配置调度中心

  1. 初始化数据库

    #
    # XXL-JOB
    # Copyright (c) 2015-present, xuxueli.
    
    CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci;
    use `xxl_job`;
    
    SET NAMES utf8mb4;
    
    CREATE TABLE `xxl_job_info`
    (
        `id`                        int(11)      NOT NULL AUTO_INCREMENT,
        `job_group`                 int(11)      NOT NULL COMMENT '执行器主键ID',
        `job_desc`                  varchar(255) NOT NULL,
        `add_time`                  datetime              DEFAULT NULL,
        `update_time`               datetime              DEFAULT NULL,
        `author`                    varchar(64)           DEFAULT NULL COMMENT '作者',
        `alarm_email`               varchar(255)          DEFAULT NULL COMMENT '报警邮件',
        `schedule_type`             varchar(50)  NOT NULL DEFAULT 'NONE' COMMENT '调度类型',
        `schedule_conf`             varchar(128)          DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型',
        `misfire_strategy`          varchar(50)  NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略',
        `executor_route_strategy`   varchar(50)           DEFAULT NULL COMMENT '执行器路由策略',
        `executor_handler`          varchar(255)          DEFAULT NULL COMMENT '执行器任务handler',
        `executor_param`            varchar(512)          DEFAULT NULL COMMENT '执行器任务参数',
        `executor_block_strategy`   varchar(50)           DEFAULT NULL COMMENT '阻塞处理策略',
        `executor_timeout`          int(11)      NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',
        `executor_fail_retry_count` int(11)      NOT NULL DEFAULT '0' COMMENT '失败重试次数',
        `glue_type`                 varchar(50)  NOT NULL COMMENT 'GLUE类型',
        `glue_source`               mediumtext COMMENT 'GLUE源代码',
        `glue_remark`               varchar(128)          DEFAULT NULL COMMENT 'GLUE备注',
        `glue_updatetime`           datetime              DEFAULT NULL COMMENT 'GLUE更新时间',
        `child_jobid`               varchar(255)          DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',
        `trigger_status`            tinyint(4)   NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行',
        `trigger_last_time`         bigint(13)   NOT NULL DEFAULT '0' COMMENT '上次调度时间',
        `trigger_next_time`         bigint(13)   NOT NULL DEFAULT '0' COMMENT '下次调度时间',
        PRIMARY KEY (`id`)
    ) ENGINE = InnoDB
      DEFAULT CHARSET = utf8mb4;
    
    CREATE TABLE `xxl_job_log`
    (
        `id`                        bigint(20) NOT NULL AUTO_INCREMENT,
        `job_group`                 int(11)    NOT NULL COMMENT '执行器主键ID',
        `job_id`                    int(11)    NOT NULL COMMENT '任务,主键ID',
        `executor_address`          varchar(255)        DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
        `executor_handler`          varchar(255)        DEFAULT NULL COMMENT '执行器任务handler',
        `executor_param`            varchar(512)        DEFAULT NULL COMMENT '执行器任务参数',
        `executor_sharding_param`   varchar(20)         DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
        `executor_fail_retry_count` int(11)    NOT NULL DEFAULT '0' COMMENT '失败重试次数',
        `trigger_time`              datetime            DEFAULT NULL COMMENT '调度-时间',
        `trigger_code`              int(11)    NOT NULL COMMENT '调度-结果',
        `trigger_msg`               text COMMENT '调度-日志',
        `handle_time`               datetime            DEFAULT NULL COMMENT '执行-时间',
        `handle_code`               int(11)    NOT NULL COMMENT '执行-状态',
        `handle_msg`                text COMMENT '执行-日志',
        `alarm_status`              tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
        PRIMARY KEY (`id`),
        KEY `I_trigger_time` (`trigger_time`),
        KEY `I_handle_code` (`handle_code`),
        KEY `I_jobid_jobgroup` (`job_id`,`job_group`),
        KEY `I_job_id` (`job_id`)
    ) ENGINE = InnoDB
      DEFAULT CHARSET = utf8mb4;
    
    CREATE TABLE `xxl_job_log_report`
    (
        `id`            int(11) NOT NULL AUTO_INCREMENT,
        `trigger_day`   datetime         DEFAULT NULL COMMENT '调度-时间',
        `running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',
        `suc_count`     int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',
        `fail_count`    int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量',
        `update_time`   datetime         DEFAULT NULL,
        PRIMARY KEY (`id`),
        UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE
    ) ENGINE = InnoDB
      DEFAULT CHARSET = utf8mb4;
    
    CREATE TABLE `xxl_job_logglue`
    (
        `id`          int(11)      NOT NULL AUTO_INCREMENT,
        `job_id`      int(11)      NOT NULL COMMENT '任务,主键ID',
        `glue_type`   varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
        `glue_source` mediumtext COMMENT 'GLUE源代码',
        `glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',
        `add_time`    datetime    DEFAULT NULL,
        `update_time` datetime    DEFAULT NULL,
        PRIMARY KEY (`id`)
    ) ENGINE = InnoDB
      DEFAULT CHARSET = utf8mb4;
    
    CREATE TABLE `xxl_job_registry`
    (
        `id`             int(11)      NOT NULL AUTO_INCREMENT,
        `registry_group` varchar(50)  NOT NULL,
        `registry_key`   varchar(255) NOT NULL,
        `registry_value` varchar(255) NOT NULL,
        `update_time`    datetime DEFAULT NULL,
        PRIMARY KEY (`id`),
        UNIQUE KEY `i_g_k_v` (`registry_group`, `registry_key`, `registry_value`) USING BTREE
    ) ENGINE = InnoDB
      DEFAULT CHARSET = utf8mb4;
    
    CREATE TABLE `xxl_job_group`
    (
        `id`           int(11)     NOT NULL AUTO_INCREMENT,
        `app_name`     varchar(64) NOT NULL COMMENT '执行器AppName',
        `title`        varchar(12) NOT NULL COMMENT '执行器名称',
        `address_type` tinyint(4)  NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
        `address_list` text COMMENT '执行器地址列表,多地址逗号分隔',
        `update_time`  datetime             DEFAULT NULL,
        PRIMARY KEY (`id`)
    ) ENGINE = InnoDB
      DEFAULT CHARSET = utf8mb4;
    
    CREATE TABLE `xxl_job_user`
    (
        `id`         int(11)     NOT NULL AUTO_INCREMENT,
        `username`   varchar(50) NOT NULL COMMENT '账号',
        `password`   varchar(50) NOT NULL COMMENT '密码',
        `role`       tinyint(4)  NOT NULL COMMENT '角色:0-普通用户、1-管理员',
        `permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',
        PRIMARY KEY (`id`),
        UNIQUE KEY `i_username` (`username`) USING BTREE
    ) ENGINE = InnoDB
      DEFAULT CHARSET = utf8mb4;
    
    CREATE TABLE `xxl_job_lock`
    (
        `lock_name` varchar(50) NOT NULL COMMENT '锁名称',
        PRIMARY KEY (`lock_name`)
    ) ENGINE = InnoDB
      DEFAULT CHARSET = utf8mb4;
    
    
    ## —————————————————————— init data ——————————————————
    
    INSERT INTO `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');
    
    INSERT INTO `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', '');
    
    INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`)
    VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);
    
    INSERT INTO `xxl_job_lock` (`lock_name`)
    VALUES ('schedule_lock');
    
    commit;
表名作用
xxl_job_group执行器信息表:维护任务执行器信息
xxl_job_info调度扩展信息表:用于保存xxl-job调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等
xxl_job_lock任务调度锁表
xxl_job_log调度日志表:用于保存xxl-job调度任务的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等
xxl_job_log_report调度日志报表:用户存储xxl-job任务调度日志的报表,调度中心报表功能页面会用到
xxl_job_logglue任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能
xxl_job_registry执行器注册表:维护在线的执行器和调度中心机器地址信息
xxl_job_user系统用户表

调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例;如果mysql做主从,调度中心集群节点务必强制走主库。

在docker destop中启动xxl-job容器

https://i-blog.csdnimg.cn/direct/8d5b1c66c770415e9470765dee0fe914.png

访问调度中心

初始登录账号密码为:admin/123456

https://i-blog.csdnimg.cn/direct/0f81b46905c74f05b56e0bd619ed2a52.png

2.springboot整合xxljob

导入依赖

 <!-- pom.xml -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.4.0</version>
        </dependency>

编写application.properties文件,引入调度中心配置

# 调度中心地址配置
xxl.job.admin.addresses=http://192.168.2.3:8040/xxl-job-admin
### xxl-job, access token
xxl.job.accessToken=xxl-job

### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9991
### xxl-job executor log-path
xxl.job.executor.logpath=
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30

编写XxlJobConfig配置文件:

@Configuration
@Slf4j
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @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;
    }
}

编写定时任务类

https://i-blog.csdnimg.cn/direct/949a892ab53d4981b033674a3fa45ea0.png

启动项目可看到执行器已经自动注册到调度中心

https://i-blog.csdnimg.cn/direct/3f32ea5358ff40d0b46a320c67b44e15.png

新建定时任务

https://i-blog.csdnimg.cn/direct/e2c430f2b2524376907b3514b0d2130d.png

操作

https://i-blog.csdnimg.cn/direct/a9bce0c7b6a543b896bc4b2274449a70.png

测试成功:

https://i-blog.csdnimg.cn/direct/bbf82e2812ed485abda24d83d166f37e.png

示例源码地址: