1. 介绍
当前主流的分布式任务调度:
ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成。 它通过弹性调度、资源管控、以及作业治理的功能,打造一个适用于互联网场景的分布式调度解决方案,并通过开放的架构设计,提供多元化的作业生态。 它的各个产品使用统一的作业 API,开发者仅需一次开发,即可随意部署。
ElasticJob 已于 年 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:2181namespace: synctask
创建作业
@ElasticSimpleJob(cron = "0/10 * * * * ?",jobName = "synctask",shardingTotalCount = 1)@Componentpublic class SyncStaticTask implements SimpleJob {//执行的流程@Overridepublic void execute(ShardingContext shardingContext) {System.out.println("elatic job执行静态任务。。。");}}
测试
直接启动spring boot项目即可。
3. 动态任务
操作步骤:
注册当前服务-》ZK创建作业配置 jobNameshardingTotalCountcorn 创建任务初始化启动任务
首先在yml中添加相关配置信息
#动态定时任务案例dynamiczk: 127.0.0.1:2181dynamicnamespace: dynamictask
注册服务
@Configurationpublic class DynamicConfig {@Value("${dynamiczk}")private String dynamiczk;@Value("${dynamicnamespace}")private String dynamicnamespace;/***** 指定当前注册地址信息*/@Beanpublic ZookeeperConfiguration zookeeperConfiguration() {return new ZookeeperConfiguration(dynamiczk, dynamicnamespace);}/***** 向Zookeeper服务注册*/@Bean(initMethod = "init")public ZookeeperRegistryCenter zookeeperRegistryCenter(ZookeeperConfiguration zookeeperConfiguration) {return new ZookeeperRegistryCenter(zookeeperConfiguration);}}
创建作业调度
@Componentpublic class DynamicTaskCreate {@Autowiredprivate 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->构建:LiteJobConfigurationLiteJobConfiguration.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 {//执行的作业@Overridepublic void execute(ShardingContext shardingContext) {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("elastic job动态任务:" + simpleDateFormat.format(new Date()));}}
测试
自行创建测试类或者编写接口访问也行
//创建任务调用,活动结束的时候执行//cron表达式就是将我们正常的时间反过来写就OKSimpleDateFormat 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");