Spring boot 集成 Elastic-job 实现定时任务
1. 介绍当前主流的分布式任务调度:featurequartzelastic-jobxxl-jobantaresopencron依赖mysqljdk1.7+, zookeeper 3.4.6+ ,maven3.0.4+mysql ,jdk1.7+ , maven3.0+jdk 1.7+ , redis , zookeeperjdk1.7+ , Tomcat8.0+HA多节点部署,通过竞争数据库锁来
1. 介绍
当前主流的分布式任务调度:
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 需要提前安装好ZK环境。
以下案例都基于Spring boot工程编写。
2. 静态任务
静态定时任务也就是指将定时执行的周期固定,每次都会按照指定时间执行,elasticjob实现该操作比较简单。我们来实现一次该操作。
操作步骤:
1.执行周期
2.分片
3.指定ZK中的命名空间
-
引入依赖
<!-- ElasticJobAutoConfiguration自动配置类作用--> <dependency> <groupId>com.github.kuhn-he</groupId> <artifactId>elastic-job-lite-spring-boot-starter</artifactId> <version>2.1.5</version> </dependency>
-
配置elasticjob注册中心
修改
bootstrap.yml
配置zookeeper服务地址信息以及注册的命名空间名字:elaticjob: zookeeper: server-lists: 127.0.0.1:2181 namespace: synctask
-
创建作业
@ElasticSimpleJob( cron = "0/10 * * * * ?", jobName = "synctask", shardingTotalCount = 1 ) @Component public class SyncStaticTask implements SimpleJob { //执行的流程 @Override public void execute(ShardingContext shardingContext) { System.out.println("elatic job执行静态任务。。。"); } }
-
测试
直接启动spring boot项目即可。
3. 动态任务
操作步骤:
- 注册当前服务-》ZK
- 创建作业配置
- jobName
- shardingTotalCount
- corn
- 创建任务
- 初始化启动任务
-
首先在yml中添加相关配置信息
#动态定时任务案例 dynamiczk: 127.0.0.1:2181 dynamicnamespace: dynamictask
-
注册服务
@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); } }
-
创建作业调度
@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); //overwrite 覆盖之前同名的任务 LiteJobConfiguration liteJobConfiguration = builder.build(); //2.开启作业 new SpringJobScheduler(instance, zookeeperRegistryCenter, liteJobConfiguration).init(); } }
-
创建定时任务
public class DynamicJob implements SimpleJob { //执行的作业 @Override public void execute(ShardingContext shardingContext) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("elastic job 动态任务:" + simpleDateFormat.format(new Date())); } }
-
测试
自行创建测试类或者编写接口访问也行
//创建任务调用,活动结束的时候执行 //cron表达式就是将我们正常的时间反过来写就OK SimpleDateFormat simpleDateFormat = new SimpleDateFormat("ss mm HH dd MM ? yyyy"); String cron = simpleDateFormat.format(seckillActivity.getEndTime()); System.out.println("cron:" + cron); dynamicTaskCreate.create("jobname", cron, 1, new DynamicJob(), "param");
更多推荐
所有评论(0)