Spring Cloud | xxl-job的使用

一、简述

XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
通过xxl-job的方式调度任务,实现定时任务是非常方便的。

官方文档:http://www.xuxueli.com/xxl-job/

本章案例源码:
源码:https://github.com/liujun19921020/SpringCloudDemo/blob/master/ProjectDemo/企业SpringCloud架构-xxljob-redis-elasticsearch
或 :链接:https://pan.baidu.com/s/1ooqaIRSeX6naOZ51aBWNHA  提取码:cwsw

这里是整了一个架构集合案例,其中的ES将在下章讲解,该文主要源码为sc-xxl-job-demo项目。

二、目标

这里我们讲述的目标功能是:每日凌晨备份前一天的数据库表,共保留2天的备份表。
例:29日凌晨备份order_amazon表,取名为order_amazon_29,并删除2天前的备分表order_amazon_27

三、搭建调度中心xxl-job-demo

调度中心的搭建请参考官方文档,有详细的步骤说明。大致如下:
1、下载源码并解压(xxl-job-admin项目即为调度中心)
2、初始化sql脚本 (/xxl-job/doc/db/tables_xxl_job.sql)
3、更改配置中心配置 (/xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties)
    配置内容说明:

    ### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8
    spring.datasource.username=root
    spring.datasource.password=root_pwd
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver

    ### 报警邮箱
    spring.mail.host=smtp.qq.com
    spring.mail.port=25
    [email protected]
    spring.mail.password=xxx
    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

    ### xxl-job, access token
    xxl.job.accessToken=

    ### xxl-job, i18n (default empty as chinese, "en" as english)
    xxl.job.i18n=

4、打包部署xxl-job-admin项目即可

  •     调度中心访问地址 例:http://localhost:8080/xxl-job-admin (该地址执行器将会使用到,作为回调地址)
  •     默认登录账号 "admin/123456", 登录后运行界面如下图所示:

Spring Cloud | xxl-job的使用_第1张图片
    
    
四、搭建执行器项目

执行器项目即为我们需要实现的功能项目,配置步骤官方文档也较详细。下面我们来实现代码:
创建一个spring boot项目,数据源配置、结构等请参考前几篇文章。

先引入xxl-job的配置
1、pom.xml中引入"xxl-job-core" 的maven依赖
 


    com.xuxueli
    xxl-job-core
    2.0.1

2、在application.properties配置文件中添加执行器配置,内容如下:

### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://xxljob.dev.java.yibainetworklocal.com/xxl-job-admin

### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=sc-xxl-job-demo-handler

### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=

### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=8800

### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=

### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler

### 执行器日志保存天数 [选填] :值大于3时生效,启用执行器Log文件定期清理功能,否则不生效;
xxl.job.executor.logretentiondays=-1

3、添加对应的引用类XxlJobConfig.java(@ComponentScan后配置的包路径即为任务的入口,届时扫描)

@Configuration
@ComponentScan(basePackages = "com.lj.scxxljobdemo.jobhandler")
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(this.getClass());

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

    @Bean(initMethod = "start", destroyMethod = "destroy")
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.debug(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppName(appName);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }
}

 

xxl-job的引入配置在这里即已结束,接下来实现业务代码,项目入口放置在XxlJobConfig.java中配置的扫描路径下,继承自IJobHandler的Java类代码:

package com.lj.scxxljobdemo.jobhandler;

/**
 * cs1db库 表数据备份
 */
@JobHandler(value = "cs1DbJobHandler")
@Component
public class Cs1DbJobHandler extends IJobHandler {

    @Autowired
    ICs1DbService cs1DbService;

    @Override
    public ReturnT execute(String s){
        try {
            String[] tableNameList = new String[]{"order_amazon","order_amazon_detail"};//要同步的表名

            CountDownLatch latch = new CountDownLatch(tableNameList.length);//设置与表相同的线程计数器,同时备份表
            for(String tableName : tableNameList){
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            cs1DbService.tableOperation(tableName);
                        } catch (Exception e) {
                            e.printStackTrace();
                        } finally {
                            latch.countDown();
                        }
                    }
                }).start();
            }
            latch.await();
            return SUCCESS;
        } catch (InterruptedException e) {
            e.printStackTrace();
            return FAIL;
        }
    }
}


通过业务代码,依次调用mybatis的xml进行建表、推数据、删表操作



    
         DROP TABLE IF EXISTS ${tableName}_${dateName};
         CREATE TABLE ${tableName}_${dateName} LIKE ${tableName}
    

    
        INSERT INTO ${tableName}_${dateName} SELECT * FROM ${tableName}
    

    
        DROP TABLE IF EXISTS ${tableName}_${dateName}
    


五、通过调度中心启动定时任务

1、访问调度中心(这里使用搭建的http://xxljob.dev.java.yibainetworklocal.com/xxl-job-admin 为例)

2、配置"执行器管理",注意对应application.properties中的配置信息

Spring Cloud | xxl-job的使用_第2张图片

3、配置执行器的对应"任务管理"新增任务

Spring Cloud | xxl-job的使用_第3张图片

Spring Cloud | xxl-job的使用_第4张图片

 

执行任务后:

Spring Cloud | xxl-job的使用_第5张图片

 

你可能感兴趣的:(Spring,Boot,Spring,Cloud,xxl-job)