基于Quartz框架、zookepper开发。
主要解决了集群下作业会多次执行、集群并不能水平扩展作业(执行效率问题)。特性如下:
需要先启动zookeeper,
com.dangdang
elastic-job-lite-spring
2.1.5
2.1创建作业类实现SimpleJob接口(简单作业任务)
特点:
public class MySimpleJob implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
int shardingItem = shardingContext.getShardingItem();//当前分片项
String jobParameter = shardingContext.getJobParameter();//当前分片自定义的参数,例如按照类型分片(txt、jpg、pdf等)
//这里可以根据分片的信息,去数据查询对应的数据,进行处理
//例如按照id奇偶数去分片。或按照类型等字段分片处理数据,提高性能
System.out.println(new Date()+":"+JSON.toJSONString(shardingContext));
}
}
2.2或实现DataFlowJob接口(数据流作业任务)
特点:
public class MyDateFlowJob implements DataflowJob
每一步在代码里都写清楚了。
@Configuration
public class ElasticJobConfig {
@Bean
public SpringJobScheduler dataFlowJobScheduler(DataSource dataSource){
//1、创建zookeeper配置(zookeeper地址,命名空间)
ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration("localhost:2181", "elastic-job");
//2、创建zookeeper配置中心,并初始化(根据zookeeper配置创建)
ZookeeperRegistryCenter zookeeperRegistryCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);
zookeeperRegistryCenter.init();
//3、创建作业配置(作业名称、cron表达式、分片数量)
JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder("myDataflowJob", "0/30 * * * * ?", 5)
.jobParameter("this jobParameter")//作业参数
.description("这个作业是干什么的?描述一下")//作业描述
.failover(true)//开始失效转移。当某节点挂掉之后,作业会分配到其他节点继续完成
.shardingItemParameters("0=txt,1=jpg,2=pdf,3=word,4=excel")//分片附带的参数
.build();
//4、创建数据流作业配置(根据作业配置、实现了DataflowJob实现类的全限定名、是否流式处理创建)
DataflowJobConfiguration dataflowJobConfiguration = new DataflowJobConfiguration(jobCoreConfiguration, MyDateFlowJob.class.getCanonicalName(),true);
//5、创建精简版作业配置(根据简单作业配置创建)
LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder(dataflowJobConfiguration)
.jobShardingStrategyClass("com.dangdang.ddframe.job.lite.api.strategy.impl.RotateServerByNameJobShardingStrategy")//配置作业分片策略类
//默认elastic-job提供了三种分片策略:
//1、AverageAllocationJobShardingStrategy 平均分配策略(默认)
//2、OdevitySortByNameJobShardingStrategy 根据作业名hash值奇偶数升降ip分配策略
//3、RotateServerByNameJobShardingStrategy 根据作业名hash值对服务器列表轮转分配策略
//你还可以自定义分配策略实现JobShardingStrategy接口
.overwrite(true)//覆盖注册中心配置。如果不覆盖,一次注册后,配置便再也不能改变了。
.monitorPort(8889)//作业辅助监控端口。当生产环境不能连接作业监控时,可通过此端口导出日志查看。
.build();
//6、创建作业事件配置(可选)(根据数据源创建)
//作用:把作业的执行过程写入数据库表中
JobEventConfiguration jobEventConfiguration = new JobEventRdbConfiguration(dataSource);
//7、创建Elastic监听器(可选)
//作用:可以在作业执行的前后做某些操作
MyDistributeOnceElasticJobListener listener = new MyDistributeOnceElasticJobListener(0,0);
//8、创建spring作业定时器,并初始化(根据作业类的实例、zookeeper注册中心、精简版作业配置、[作业事件配置]、[elastic监听器])
//作用:正式创建作业
SpringJobScheduler springJobScheduler = new SpringJobScheduler(new MyDateFlowJob(), zookeeperRegistryCenter, liteJobConfiguration, jobEventConfiguration, listener);
springJobScheduler.init();
return springJobScheduler;
}
}
public class MyDistributeOnceElasticJobListener extends AbstractDistributeOnceElasticJobListener {
public MyDistributeOnceElasticJobListener(long startedTimeoutMilliseconds, long completedTimeoutMilliseconds) {
super(startedTimeoutMilliseconds, completedTimeoutMilliseconds);
}
@Override
public void doBeforeJobExecutedAtLastStarted(ShardingContexts shardingContexts) {
System.out.println("监听器--执行之前执行的方法");
}
@Override
public void doAfterJobExecutedAtLastCompleted(ShardingContexts shardingContexts) {
System.out.println("监听器--执行之后执行的方法");
}
}
1、下载项目:https://github.com/apache/shardingsphere-elasticjob/tree/2.1.5/elastic-job-lite,下载完成解压
2、maven package打包elastic-job-lite-console项目,之后在target目录下有一个elastic-job-lite-console-2.1.5.tar.gz文件
3、解压elastic-job-lite-console-2.1.5.tar.gz文件,进入bin目录下执行start.sh启动
4、访问http://localhost:8899/。账号密码:root/root
1、全局配置,添加zookeeper信息和mysql信息
2、作业操作:可以看到作业的信息和服务器的信息
3、作业历史:可以查看作业的执行情况
当无法在生产环境使用zookeeper时,我们可以通过作业辅助端口,导出作业执行情况,方便debug调试。
1、需要在LiteJobConfiguration配置中打开作业辅助端口.
2、需要使用dump命令和nc命令,没有需要安装
3、执行echo dump|nc 127.0.0.1 9888 > job_debug_dump.txt 命令