springBoot集成 Elastic-job

Elastic-job 是由当当网开源的轻量级无中心化定时任务解决方案,使用jar包的形式提供最轻量级的分布式任务的协调服务,外部依赖仅Zookeeper

其中基本的概念是分片,任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的服务器分别执行某一个或几个分片项。例如,一个任务需要处理100w的数据,现在将任务设置为两个分片,两台服务,一台服务获取一个分片,并处理不通的数据。Elastic-Job并不直接提供数据处理的功能,框架只会将分片项分配至各个运行中的作业服务器,开发者需要自行处理分片项与真实数据的对应关系。

Elastic-job 没有作业调度中心节点,而是基于部署作业框架的程序在到达相应时间点时各自触发调度,注册中心的作用只是用户作业的注册和监控信息的存储,主节点的作用是主要用来处理分片。

基于分片的设计思想,一旦执行作业的服务器崩溃,等待执行的服务器将会在下次作业启动时重新触发分片操作,并进行执行操作。

架构图如下:

接入步骤:

1)<!-- 引入elastic-job-lite核心模块 -->

<dependency>

    <groupId>com.dangdang</groupId>

    <artifactId>elastic-job-lite-core</artifactId>

    <version>${latest.release.version}</version>

</dependency>

<!-- 使用springframework自定义命名空间时引入 -->

<dependency>

    <groupId>com.dangdang</groupId>

    <artifactId>elastic-job-lite-spring</artifactId>

    <version>${latest.release.version}</version>

</dependency>

2)作业开发

public class MyElasticJob implements SimpleJob {

    @Override

    public void execute(ShardingContext context) {

         switch (context.getShardingItem()) {

          case 0: // do something by sharding item 0 break;

          case 1: // do something by sharding item 1 break;

          case 2: // do something by sharding item 2 break; //

          case n: ...

         }

     }

 }

Elastic-Job提供SimpleDataflowScript 3种作业类型。 方法参数shardingContext包含作业配置、片和运行时信息。可通过getShardingTotalCount(), getShardingItem()等方法分别获取分片总数,运行在本作业服务器的分片序列号等

a: Simple类型作业

意为简单实现,未经任何封装的类型。需实现SimpleJob接口。该接口仅提供单一方法用于覆盖,此方法将定时执行。与Quartz原生接口相似,但提供了弹性扩缩容和分片等功能

b: Dataflow类型作业

Dataflow类型用于处理数据流,需实现DataflowJob接口。该接口提供2个方法可供覆盖,分别用于抓取(fetchData)和处理(processData)数据。

可通过DataflowJobConfiguration配置是否流式处理。

流式处理数据只有fetchData方法的返回值为null或集合长度为空时,作业才停止抓取,否则作业将一直运行下去; 非流式处理数据则只会在每次作业执行过程中执行一次fetchData方法和processData方法,随即完成本次作业。

如果采用流式作业处理方式,建议processData处理数据后更新其状态,避免fetchData再次抓取到,从而使得作业永不停止。 流式数据处理参照TbSchedule设计,适用于不间歇的数据处理。

c: Script类型作业

Script类型作业意为脚本类型作业,支持shellpythonperl等所有类型脚本。只需通过控制台或代码配置scriptCommandLine即可,无需编码。执行脚本路径可包含参数,参数传递完毕后,作业框架会自动追加最后一个参数为作业运行时信息。

3)spring命名空间配置

<?xml version="1.0" encoding="UTF-8"?>

<beans

xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:reg="http://www.dangdang.com/schema/ddframe/reg" xmlns:job="http://www.dangdang.com/schema/ddframe/job" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.dangdang.com/schema/ddframe/reg http://www.dangdang.com/schema/ddframe/reg/reg.xsd http://www.dangdang.com/schema/ddframe/job http://www.dangdang.com/schema/ddframe/job/job.xsd ">

<!--配置作业注册中心 -->

<reg:zookeeper id="regCenter" server-lists=" yourhost:2181" namespace="dd-job" base-sleep-time-milliseconds="1000" max-sleep-time-milliseconds="3000" max-retries="3" />

<!-- 配置作业-->

<job:simple id="oneOffElasticJob" class="xxx.MyElasticJob" registry-center-ref="regCenter" cron="0/10 * * * * ?" sharding-total-count="3" sharding-item-parameters="0=A,1=B,2=C" />

 </beans>

 

Springboot 使用elasticjob 方法:

  1. 在pom中引入
<!-- https://mvnrepository.com/artifact/com.dangdang/elastic-job-lite-core -->

<dependency>

    <groupId>com.dangdang</groupId>

    <artifactId>elastic-job-lite-core</artifactId>

    <version>2.1.5</version>

</dependency>

<!-- 使用springframework自定义命名空间时引入 -->

<dependency>

    <groupId>com.dangdang</groupId>

    <artifactId>elastic-job-spring</artifactId>

    <version>1.1.1</version>

</dependency>
  1. 配置注册中心
@Data

@Configuration

public class ZkConfig {

    private String zkHost = "10.143.117.32:2181,10.143.117.32:2182,10.143.117.32:2183";



    private String namespace = "gome-job";



    @Bean

    public ZookeeperConfiguration zkConfiguration() {

        ZookeeperConfiguration zk = new ZookeeperConfiguration(zkHost, namespace);

        zk.setBaseSleepTimeMilliseconds(1000);

        zk.setMaxSleepTimeMilliseconds(3000);

        zk.setMaxRetries(3);

        return zk;

    }



    @Bean(initMethod = "init")

    public  ZookeeperRegistryCenter regCenter(ZookeeperConfiguration config) {

        return new ZookeeperRegistryCenter(config);

    }

}

 

  1. 编写simpleJob任务
public class SimpleJob implements com.dangdang.ddframe.job.api.simple.SimpleJob {



    @Override

    public void execute(ShardingContext context) {

        System.out.println("任务执行");

        System.out.println("shardItems : " + context.getShardingItem() );

        String sql = "select * from t_user where right(id,1) = " + context.getShardingItem();

        System.out.println(sql);

    }

}
  1. springboot启动后初始化任务
@Component

@RequiredArgsConstructor

public class JobInitRunner implements CommandLineRunner {

    private final CoordinatorRegistryCenter regCenter;

    @Override

    public void run(String... strings) throws Exception {

        System.out.println("任务初始化。。。");

        jobInit();

    }



    public void jobInit() {

        addJob(createLiteJobConfiguration("SimpleJob","0/5 * * * * ?",10,SimpleJob.class, JobType.SIMPLE));

        addJob(createLiteJobConfiguration("DataJob", "0/5 * * * * ?", 10,DateJob.class,JobType.DATAFLOW));

    }

    private void addJob(LiteJobConfiguration jobConfiguration) {

        new JobScheduler(regCenter, jobConfiguration).init();

    }


    private LiteJobConfiguration createLiteJobConfiguration(String JobName, String cron, int shardingCount, Class c, JobType type){

        JobCoreConfiguration coreConfig = JobCoreConfiguration.newBuilder(JobName, cron, shardingCount).build();


        JobTypeConfiguration jobConfig = new SimpleJobConfiguration(coreConfig, c.getCanonicalName());


        if(type.compareTo(JobType.DATAFLOW) == 0){

            jobConfig = new DataflowJobConfiguration(coreConfig,c.getCanonicalName(),true);

        }

        return LiteJobConfiguration.newBuilder(jobConfig).build();

    }


}
  1. springboot启动
@SpringBootApplication

public class Main {

    public static void main(String[] args) {

        SpringApplication.run(Main.class,args);

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值