# ElasticJob **Repository Path**: lsjkclyc/ElasticJob ## Basic Information - **Project Name**: ElasticJob - **Description**: 分布式任务调度框架ElasticJobElastic-job总共提供了三种类型的定时任务:Simple类型定时任务、Dataflow类型定时任务和Script类型定时任务。其中,Script类型作业意为脚本类型作业,支持shell,python和perl等所有类型脚本,应用得不太多。SimpleJob需要实现SimpleJob接口,是未经过任何封装的定时任务简单实现,与quartz原生接口相似,下面示例中用的就是该类型的Job。Dataflow类型的定时任务主要用于处理数据流,需实现DataflowJob接口。该接口可以提供2个方法可供覆盖,分别用于抓取(fetchData)和处理(processData)数据。这个框架的任务分派,简单来说就是,通过zookeeper知道线上总共有多少台执行机器,然后把分片平均分到线上的机器上,而每次机器的上线、下线都会触发分片的重新分配。 而分片其实就是数字,数字将平均分配到几台机器上,例如: 设置总分片数为4片(0,1,2,3总共4个分片),线上2台机器,机器A可能被分配到0、1两个数字,机器B被分配到2、3两个数字 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2019-05-25 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ElasticJob #### 介绍 分布式任务调度框架ElasticJob Elastic-job总共提供了三种类型的定时任务:Simple类型定时任务、Dataflow类型定时任务和Script类型定时任务。其中,Script类型作业意为脚本类型作业,支持shell,python和perl等所有类型脚本,应用得不太多。SimpleJob需要实现SimpleJob接口,是未经过任何封装的定时任务简单实现,与quartz原生接口相似,下面示例中用的就是该类型的Job。Dataflow类型的定时任务主要用于处理数据流,需实现DataflowJob接口。该接口可以提供2个方法可供覆盖,分别用于抓取(fetchData)和处理(processData)数据。 这个框架的任务分派,简单来说就是,通过zookeeper知道线上总共有多少台执行机器,然后把分片平均分到线上的机器上,而每次机器的上线、下线都会触发分片的重新分配。 而分片其实就是数字,数字将平均分配到几台机器上,例如: 设置总分片数为4片(0,1,2,3总共4个分片),线上2台机器,机器A可能被分配到0、1两个数字,机器B被分配到2、3两个数字,然后就可以根据这个 注意:如果多个机器运行同一个任务,那么将这个任务部署到多个机器上,如果想实现任务分片处理,每个任务中的任务名称设置必须相同(命名空间也的相同), String serverLists = "localhost:2181"; //如果你有多个不同 Elastic-Job集群 时,使用相同 Zookeeper,可以配置不同的 namespace 进行隔离 String namespace = "elastic-job-demo"; CoordinatorRegistryCenter registryCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverLists, namespace)); registryCenter.init(); // 定义作业核心配置 String jobName = "simpleJob1"; //作业名称 String cron = "0/5 * * * * ?"; //定时器表达式,用于控制作业触发时间 int shardingTotalCount = 4; //作业分片总数,如果一个作业启动超过作业分片总数的节点,只有 shardingTotalCount 会执行作业.换句话说:当服务器数量大于分片总数,那么不是所有服务器都将会执行,而是根据分片总数来定。 //coreConfiguration JobCoreConfiguration.Builder builder = JobCoreConfiguration.newBuilder(jobName, cron, shardingTotalCount); builder.failover(true); builder.misfire(true); //builder = builder.jobParameter("0=A,1=B,2=C"); builder = builder.shardingItemParameters("0=A,1=B,2=C,3=D"); JobCoreConfiguration coreConfiguration = builder.build(); 注意:zookeeper中同一个命名空间下,多个server中的同一个任务名称必须相同,【如果你想做一个任务在多台server上部署并实现分片,那么每个server启动时配置的zookeeper命名空间必须一致,】【貌似一个zookeeper namespace命名空间下只能有一个任务 】 String namespace = "elastic-job-demo"; CoordinatorRegistryCenter registryCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverLists, namespace)); 任务的class也必须一样才行 String jobClass = MyElasticJob.class.getCanonicalName(); SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(coreConfiguration, jobClass); 注意点: 如果某台服务器分了2个分区,那么任务定时跑的时候,这台服务器会根据被分配几个分区就创建几个线程,这几个线程同时执行SimpleJob的execute(ShardingContext shardingContext)方法