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
调度中心的搭建请参考官方文档,有详细的步骤说明。大致如下:
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项目即可
执行器项目即为我们需要实现的功能项目,配置步骤官方文档也较详细。下面我们来实现代码:
创建一个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中的配置信息
3、配置执行器的对应"任务管理"新增任务
执行任务后: