您的位置:首页 > 其它

[置顶] elastic job (一) elastic-job-lite----SimpleJob

2017-07-27 17:39 459 查看
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-lite 下面的elastic-job-lite-console,然后用mvn 打包。

最终得到elastic-job-lite-console-2.1.5.tar.gz。保存下来上传到linux下,并且解压,在bin文件夹下执行./start.sh (-p 可以指定端口号)

启动成功访问 地址:端口号



能访问到这个页面就算搭建成功了。

(elastic-job 是依赖zookeeper来做协调的,所以还需要有zookeeper环境,搭建很简单,我就不贴出来)

现在开始编写任务代码:

job类型分为 SimpleJob 简单任务、Dataflow类型作业、Script类型作业

我们先来最简单的SimpleJob

首先将依赖的包引入进来:

<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.1.5</version>
</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;
}

}


执行一下:



可以看到每隔10秒 2个分片都执行了,这就是 切片功能,可以并行处理。比如2个DB 一个在上海一个在北京,那么就可以按照分片的内容来进行分别执行2个地区的数据。

然后回到运维界面,


在注册中心点击 ADD 注册中心名称:随便定 注册中心地址: zk 地址 命名空间就是之前说到namespace,登录凭证如果没有可以不填。添加完之后点击连接。



连接完之后点击作业维度,可以看到刚刚执行的任务,目前状态是已下线。

现在再把之前的mian函数执行一下,


可以看到状态已经是正常了,并且多了好几个操作。其他的都很明白,就修改比较重要点。点击



可以看到除了上面3个选项其他都可以更改,main函数不关闭,并且在运维平台直接修改配置,会立即生效,大家可以自己试试玩玩。有一点需要提醒的是 如果在平台修改过配置,如果没有在平台将任务删除重新执行main函数的话,配置是会被平台的配置覆盖的。

这是elastic-job-lite 的SimpleJob,下一章我们讨论下DataflowJob。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: