xxl-job是一款开源的分布式任务调度框架,它能够帮助你实现定时任务的调度和管理.
🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗
1. 在平时的业务场景中,经常有一些场景需要使用定时任务
1. 某个时间点发送优惠券,发送短信等等
2. 报表
3. 爬虫
1. 批量统计上个月的账单,统计上个月销售数据等等
1. 每隔5分钟需要执行一次,等
在Java中,传统的定时任务实现方案,比如Timer,Quartz等
不支持集群、不支持统计、没有管理平台、没有失败报警、没有监控等等
1. 同一个服务多个实例的任务存在互斥时,需要统一的调度
2. 任务调度需要支持高可用、监控、故障告警
3. 需要统一管理和追踪各个服务节点任务调度的结果,需要记录保存任务属性信息等
1. 非分布式
在单一个服务器当中,创建定时任务
@Scheduled
2. 分布式
把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式,叫做分布式定时任务。
2.1 Quartz
先驱者
无图形化界面
接口不人性化
2.2 Elasticjob
基于Quartz
elastic-job 是由当当网基于quartz 二次开发之后的分布式调度解决方案
依赖很多中间件 zk,
2.3 xxl-job
美团点评里面开发者开发出来
2.4 SchedulerX
阿里云出的一个框架
商用产品
2.5 PowerJob
个人
2.6 对比
1. 本次使用的是2.3.0版本的
2. 我感觉有bug 启动多个服务xxl-job始终有一个服务是超时的
1. https://www.xuxueli.com/xxl-job/
2. https://gitee.com/xuxueli0323/xxl-job/
1. xxl-job是出自大众点评许雪里(xxl就是作者名字的拼音首字母)的开源项目,官网上介绍这是一个轻量级分布式任务调度框架,
2. 其核心设计目标是开发迅速、学习简单、轻量级、易扩展。跟elasticjob不同,xxl-job环境依赖于mysql,不用ZooKeeper,这也是最大的不同。
3. xxl-job中心式的调度平台轻量级,开箱即用,操作简易,上手快,与SpringBoot有非常好的集成,而且监控界面就集成在调度中心,界面又简洁,
4. 对于企业维护起来成本不高,还有失败的邮件告警等等。这就使很多企业选择xxl-job做调度平台。
1. 调度模块(调度中心)
1.1 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。
1.2 调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
1.3 支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover
2. 执行模块(执行器)
1. 负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效; 接收“调度中心”的执行请求、终止请求和日志请求等
3. 功能架构图
1. 设置时间
2. 集群,使用的策略
3. 创建任务时会指定任务名称,地址
1. 配置上调度系统的地址
2. 创建任务,在任务上指定任务名称
1. https://github.com/xuxueli/xxl-job/releases/tag/2.3.0
1. /xxl-job-2.3.0/doc/db/tables_xxl_job.sql
2. 将sql文件执行创建数据库
1. mvn clean -U package -Dmaven.test.skip=true
1. java -jar xxl-job-admin-2.3.0.jar --server.port=8088
2. http://localhost:8088/xxl-job-admin/toLogin
3. 用户名与密码
admin
123456
4. 主界面
1. 启动xll-job-admin调度模块,直接运行
2. xxl-job-excuotr需要配置xxl-job-admin的地址,主动向Xxl-job-admin注册
3. 流程图
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>
server:
port: 8011
xxl:
job:
admin:
addresses: http://127.0.0.1:8000/xxl-job-admin
executor:
appname: yby-job-2
logpath: /Users/yangbuyi/Documents/分布式任务调度/log
@Component
@Slf4j
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setLogPath(logPath);
return xxlJobSpringExecutor;
}
}
1. 执行器的名称要和配置文件 当中的appname名称一样
1. 就是一个负载均衡
2. 当只有一个任务调度中心, 有多个执行器的时候 ,任务调度中心要选择一个或多个执行器来执行任务
1. 设置允许并行运行
2. 更改yml端口-进行运行
1. 修改任务管理调度器-故障转移
2. 当一台机器出现故障时, 转到移另一台机器上
1. 按照我们注册到执行器的顺序来进行访问的
2. 我们进行将第一台服停止(宕机)
2. 宕机(10001)后xxl-job会发送心跳检查是否能调用,请求不了后xxl-job将会继续按照顺序执行那么就轮到了9999 来进行调度任务的操作
1. 获取当前服务的索引: XxlJobHelper.getShardIndex();
2. 获取执行器注册的总数: XxlJobHelper.getShardTotal();
3. 修改任务路由策略为- 分片广播
4. 启动3个服务(因为我发现启动多个服务始终有一个是请求超时所以我们要用2个则多启动一个即可,官方还没提示bug的处理方案.)
5. 启动任务查看分片广播-分别发送了任务到两个服务上
@XxlJob("myJobHandler")
public ReturnT<String> execute() {
// 当前的调度号 机器的总数
List<Integer> users = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
for (Integer user : users) {
// 获取机器的总数 getShardTotal
// 获取当前机器的索引 getShardIndex
if (user % XxlJobHelper.getShardTotal() == XxlJobHelper.getShardIndex()) {
log.info("给{}号学生发送短信:index={},total={}", user, XxlJobHelper.getShardIndex(), XxlJobHelper.getShardTotal());
}
}
return ReturnT.SUCCESS;
}
我们就讲到着还有很多路由策略,一般使用的就是这两个.
本期结束咱们下次再见👋~
🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。