elastic job (一) elastic-job-lite----SimpleJob

elastic-job分为elastic-job-lite 和elastic-job-cloud两部分,笔者最近打算再深度学习一下elastic-job,看了下版本升级到2.1.5了,我们就按照这个版本来学习elastic-job。
文档官网:http://dangdangdotcom.github.io/elastic-job/elastic-job-lite/01-start/quick-start/

首先我们要了解一下什么是任务调度,调度就是将一个任务套上一个时间,让该任务可以在时间规律上去循环执行。一般的技术quartz、spring task、java.util.Timer,这几种如果在单一机器上跑其实问题不大,但是如果一旦应用于集群环境做分布式部署,就会带来一个致命的问题,那就是重复执行,当然解决方案有,但是必须依赖数据库,将任务执行状态持久化下来。所以当当就把quartz和zookeeper结合起来达到分布式调度,并且添加其他功能,形成了elastic-job。
功能列表:
分布式调度协调
弹性扩容缩容
失效转移
错过执行作业重触发
作业分片一致性,保证同一分片在分布式环境中仅一个执行实例
自诊断并修复分布式不稳定造成的问题
支持并行调度
支持作业生命周期操作
丰富的作业类型
Spring整合以及命名空间提供
运维平台
下面我们来学习一下elastic-job-lite
首先我们可以先将运维平台搭建起来:
1、https://github.com/dangdangdotcom/elastic-job
下载源码
elastic job (一) elastic-job-lite----SimpleJob_第1张图片
找到elastic-job-lite 下面的elastic-job-lite-console,然后用mvn 打包。
最终得到elastic-job-lite-console-2.1.5.tar.gz。保存下来上传到linux下,并且解压,在bin文件夹下执行./start.sh (-p 可以指定端口号)
启动成功访问 地址:端口号
elastic job (一) elastic-job-lite----SimpleJob_第2张图片
能访问到这个页面就算搭建成功了。
(elastic-job 是依赖zookeeper来做协调的,所以还需要有zookeeper环境,搭建很简单,我就不贴出来)
现在开始编写任务代码:
job类型分为 SimpleJob 简单任务、Dataflow类型作业、Script类型作业
我们先来最简单的SimpleJob
首先将依赖的包引入进来:

 <dependency>
      <groupId>com.dangdanggroupId>
      <artifactId>elastic-job-lite-coreartifactId>
      <version>2.1.5version>
 dependency>

写一个任务:

package cn.job;

import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;

import java.util.Date;

/**
 * Created by siliang 2017/7/27.
 */
public class SimpleJobDemo implements SimpleJob{
    @Override
    public void execute(ShardingContext shardingContext) {
        System.out.println(new Date()+" job名称 = "+shardingContext.getJobName()
                +"分片数量"+shardingContext.getShardingTotalCount()
                +"当前分区"+shardingContext.getShardingItem()
                +"当前分区名称"+shardingContext.getShardingParameter()
                +"当前自定义参数"+shardingContext.getJobParameter()+"============start=================");


    }
}

然后再写一个main函数来启动

package cn.job;

import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.dangdang.ddframe.job.config.JobCoreConfiguration;
import com.dangdang.ddframe.job.config.dataflow.DataflowJobConfiguration;
import com.dangdang.ddframe.job.lite.api.JobScheduler;
import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;
import com.dangdang.ddframe.job.reg.base.CoordinatorRegistryCenter;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;

/**
 * Created by siliang on 2017/7/26.
 */
public class TestJob {

    public static void main(String[] args) {
        new JobScheduler(createRegistryCenter(), createJobConfiguration("A")).init();
    }
    private static CoordinatorRegistryCenter createRegistryCenter() {
    //192.168.112.128:2181,192.168.112.128:2182 这个为zk的地址
    //demo-job 这个为1个zk环境的下的1个namespace 可以有多个 1个namespace下有多个job
        CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(
                new ZookeeperConfiguration("192.168.112.128:2181,192.168.112.128:2182", "demo-job"));
        regCenter.init();
        return regCenter;
    }
    private static LiteJobConfiguration createJobConfiguration(String jobParameter) {
        // mySimpleTest 为jobname 0/10 * * * * ?为cron表达式  2 分片数量  0=北京,1=上海 分片对应内容  jobParameter 自定义参数
       JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder("simpleJobDemo", "0/10 * * * * ?", 2).shardingItemParameters("0=北京,1=上海").jobParameter(jobParameter).build();
        SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, SimpleJobDemo.class.getCanonicalName());
        JobRootConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).build();

        return  result;
    }

}

执行一下:
elastic job (一) elastic-job-lite----SimpleJob_第3张图片
可以看到每隔10秒 2个分片都执行了,这就是 切片功能,可以并行处理。比如2个DB 一个在上海一个在北京,那么就可以按照分片的内容来进行分别执行2个地区的数据。

然后回到运维界面,elastic job (一) elastic-job-lite----SimpleJob_第4张图片
在注册中心点击 ADD 注册中心名称:随便定 注册中心地址: zk 地址 命名空间就是之前说到namespace,登录凭证如果没有可以不填。添加完之后点击连接。
elastic job (一) elastic-job-lite----SimpleJob_第5张图片
连接完之后点击作业维度,可以看到刚刚执行的任务,目前状态是已下线。
现在再把之前的mian函数执行一下,elastic job (一) elastic-job-lite----SimpleJob_第6张图片
可以看到状态已经是正常了,并且多了好几个操作。其他的都很明白,就修改比较重要点。点击
elastic job (一) elastic-job-lite----SimpleJob_第7张图片
可以看到除了上面3个选项其他都可以更改,main函数不关闭,并且在运维平台直接修改配置,会立即生效,大家可以自己试试玩玩。有一点需要提醒的是 如果在平台修改过配置,如果没有在平台将任务删除重新执行main函数的话,配置是会被平台的配置覆盖的。
这是elastic-job-lite 的SimpleJob,下一章我们讨论下DataflowJob。

你可能感兴趣的:(elastic-job)