一、分布式任务调度产品了解:
1) TBSchedule:淘宝推出的一款非常优秀的高性能分布式调度框架,目前被应用于阿里、京东、支付宝、国美等很多互联网企业的流程调度系统中。但是已经多年未更新,文档缺失严重,缺少维护。
2) XXL-Job:大众点评的分布式任务调度平台,是一个轻量级分布式任务调度平台, 其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
3)Elastic-job:当当网借鉴TBSchedule并基于quartz 二次开发的弹性分布式任务调度系统,功能丰富强大,采用zookeeper实现分布式协调,具有任务高可用以及分片功能。
4)Saturn: 唯品会开源的一个分布式任务调度平台,基于Elastic-job,可以全域统一配置,统一监 控,具有任务高可用以及分片功能。 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
源码地址:https://gitee.com/xuxueli0323/xxl-job
文档地址:https://www.xuxueli.com/xxl-job/
二、初始化“调度数据库”
数据库sql脚本:下载项目源码并解压;
脚本所在位置:/xxl-job/doc/db/tables_xxl_job.sql
若为集群部署,集群情况下各节点务必连接同一个mysql实例
若mysql做主从,调度中心集群节点务必强制走主库
- xxl_job_lock:任务调度锁表;
- xxl_job_group:执行器信息表,维护任务执行器信息;
- xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
- xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
- xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
- xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
- xxl_job_user:系统用户表;
三、配置部署"调度中心"项目
启动方式:
- 虚拟机启动
cd /opt/hmtt/db ./close.sh ./start.sh
- 源码启动
调度中心项目: xxl-job-admin
配置文件地址:/xxl-job/xxl-job-admin/src/main/resources/application.properties
数据库连接信息:
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://192.168.85.143:3306/xxl_job?Unicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
启动项目:XxlJobAdminApplication
访问调度中心:http://localhost:8080/xxl-job-admin
默认登录账号密码:admin 123456
四、项目集成xxl-job
微服务端:
1.pom.xml配置文件
<!-- xxl-job -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.0</version>
</dependency>
2.application.yml配置文件
xxl:
job:
admin:
addresses: http://192.168.85.143:8080/xxl-job-admin
executor:
appname: ${spring.application.name}-executor
port: 9991
3.引导类开启定时任务
@EnableScheduling //开启定时任务
@SpringBootApplication
public class ArticleApp {
public static void main(String[] args) {
SpringApplication.run(ArticleApp.class, args);
}
}
4.添加xxl-job配置类
package com.heima.article.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* xxl-job config
*
* @author xuxueli 2017-04-28
*/
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.port}")
private int port;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setPort(port);
return xxlJobSpringExecutor;
}
}
5.创建task任务类
注意:注解保持一致,返回结果是ReturnT,携带参数是String param
package com.heima.article.task;
import com.heima.article.service.IApArticleService;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class HotArticleTask {
@Autowired
private IApArticleService articleService;
@XxlJob("computeHotArticleJob") //一定要与调度中心新建任务的JobHandler的值保持一致
public ReturnT<String> computeHotArticleJob(String param) throws Exception {
log.info("开始执行每日文章分值计算任务...");
try {
articleService.compute();
} catch (Exception e) {
e.printStackTrace();
return ReturnT.FAIL;
}
return ReturnT.SUCCESS;
}
}
6.启动项目测试
任务调度中心:
1.配置执行器
2.新增任务管理
3.启动执行
五、总结
注意事项:
1.定时执行失败,时间不一致(虚拟机时间与本机时间对不上)重启虚拟机或者更新时间