持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情
每日英语:
Years may wrinkle the skin, but to give up enthusiasm wrinkles the soul.
翻译:岁月悠悠,衰微只及肌肤;热忱抛却,颓废必至灵魂。 ——塞缪尔·厄尔曼
elastic-job介绍
当前主流的分布式任务调度:
| feature | quartz | elastic-job | xxl-job | antares | opencron |
|---|---|---|---|---|---|
| 依赖 | mysql | jdk1.7+, zookeeper 3.4.6+ ,maven3.0.4+ | mysql ,jdk1.7+ , maven3.0+ | jdk 1.7+ , redis , zookeeper | jdk1.7+ , Tomcat8.0+ |
| HA | 多节点部署,通过竞争数据库锁来保证只有一个节点执行任务 | 通过zookeeper的注册与发现,可以动态的添加服务器。 支持水平扩容 | 集群部署 | 集群部署 | — |
| 任务分片 | — | 支持 | 支持 | 支持 | — |
| 文档完善 | 完善 | 完善 | 完善 | 文档略少 | 文档略少 |
| 管理界面 | 无 | 支持 | 支持 | 支持 | 支持 |
| 难易程度 | 简单 | 简单 | 简单 | 一般 | 一般 |
| 公司 | OpenSymphony | 当当网 | 个人 | 个人 | 个人 |
| 高级功能 | — | 弹性扩容,多种作业模式,失效转移,运行状态收集,多线程处理数据,幂等性,容错处理,spring命名空间支持 | 弹性扩容,分片广播,故障转移,Rolling实时日志,GLUE(支持在线编辑代码,免发布),任务进度监控,任务依赖,数据加密,邮件报警,运行报表,国际化 | 任务分片, 失效转移,弹性扩容 , | 时间规则支持quartz和crontab ,kill任务, 现场执行,查询任务运行状态 |
| 使用企业 | 大众化产品,对分布式调度要求不高的公司大面积使用 | 36氪,当当网,国美,金柚网,联想,唯品会,亚信,平安,猪八戒 | 大众点评,运满满,优信二手车,拍拍贷 | — | — |
ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成。 它通过弹性调度、资源管控、以及作业治理的功能,打造一个适用于互联网场景的分布式调度解决方案,并通过开放的架构设计,提供多元化的作业生态。 它的各个产品使用统一的作业 API,开发者仅需一次开发,即可随意部署。
ElasticJob 已于 2020 年 5 月 28 日成为 Apache ShardingSphere 的子项目。
elastic-job静态定时任务
静态定时任务也就是指将定时执行的周期固定,每次都会按照指定时间执行,elasticjob实现该操作比较简单。我们来实现一次该操作。
后面执行定时更新静态页,我们可以在canal服务中执行操作。
1)引入依赖包
<!-- ElasticJobAutoConfiguration自动配置类作用-->
<dependency>
<groupId>com.github.kuhn-he</groupId>
<artifactId>elastic-job-lite-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
2)配置elasticjob注册中心
修改bootstrap.yml配置zookeeper服务地址信息以及注册的命名空间名字:
elaticjob:
zookeeper:
server-lists: 192.168.xxx.xxx:2181
namespace: synctask
3)创建作业
创建作业类com.xz.canal.task.statictask.SyncStaticTask,代码如下:
@ElasticSimpleJob(
cron = "0/10 * * * * ?",
jobName = "synctask",
shardingTotalCount = 1
)
@Component
public class SyncStaticTask implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
System.out.println("执行任务。。。");
}
}
elastic-job动态定时任务
修改mall-canal-service的核心配置文件,添加zookeeper服务信息,配置如下:
#动态定时任务案例
dynamiczk: 192.168.xxx.xxx:2181
dynamicnamespace: dynamictask
向Zookeeper注册信息,创建com.xz.canal.job.dynamic.DynamicConfig代码如下:
@Configuration
public class DynamicConfig {
@Value("${dynamiczk}")
private String dynamiczk;
@Value("${dynamicnamespace}")
private String dynamicnamespace;
/****
* 指定当前注册地址信息
*/
@Bean
public ZookeeperConfiguration zookeeperConfiguration() {
return new ZookeeperConfiguration(dynamiczk,dynamicnamespace);
}
/****
* 向Zookeeper服务注册
*/
@Bean(initMethod = "init")
public ZookeeperRegistryCenter zookeeperRegistryCenter(ZookeeperConfiguration zookeeperConfiguration){
return new ZookeeperRegistryCenter(zookeeperConfiguration);
}
}
作业调度创建com.xz.canal.job.dynamic.DynamicTaskCreate,代码如下:
@Component
public class DynamicTaskCreate {
@Autowired
private ZookeeperRegistryCenter zookeeperRegistryCenter;
/***
* 作业创建
* @param jobName:作业名字
* @param cron:表达式
* @param shardingTotalCount:分片数量
* @param instance:作业实例
* @param parameters:额外参数
*/
public void create(String jobName, String cron, int shardingTotalCount, SimpleJob instance,String parameters){
//1.配置作业->Builder->构建:LiteJobConfiguration
LiteJobConfiguration.Builder builder = LiteJobConfiguration.newBuilder(new SimpleJobConfiguration(
JobCoreConfiguration.newBuilder(
jobName,
cron,
shardingTotalCount
).jobParameter(parameters).build(),
instance.getClass().getName()
)).overwrite(true);
LiteJobConfiguration liteJobConfiguration = builder.build();
//2.开启作业
new SpringJobScheduler(instance,zookeeperRegistryCenter,liteJobConfiguration).init();
}
}
总结
本篇主要介绍了一下elastic-job跟其他主流分布式任务调度的对比,还有其静态定时任务和动态定时任务的简单实现。