ElasticJob整合springBoot-自定义封装工具包

ElasticJob简介

中文官网

elasticJob自定义封装个工具包

一、pom依赖

     <dependency>
         <groupId>com.dangdang</groupId>
         <artifactId>elastic-job-lite-core</artifactId>
         <version>2.1.5</version>
     </dependency>
     <dependency>
         <groupId>com.dangdang</groupId>
         <artifactId>elastic-job-lite-spring</artifactId>
         <version>2.1.5</version>
     </dependency>

二、自定义注册类

ElasticJobAutoConfiguration

package com.elasticjob.spring.boot.autoconfigure;


import com.alibaba.druid.pool.DruidDataSource;
import com.dangdang.ddframe.job.event.JobEventConfiguration;
import com.dangdang.ddframe.job.event.rdb.JobEventRdbConfiguration;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
 * created by xiao.lizi 2020/5/26 16:12
 */
@Configuration
@Import({ElasticConfigHelper.class})
@EnableConfigurationProperties({RegCenterProperties.class, ElasticJobEventRdbProperties.class})
public class ElasticJobAutoConfiguration {
    private static final Logger logger = LoggerFactory.getLogger(ElasticJobAutoConfiguration.class);

    @Bean
    public JobEventConfiguration jobEventConfiguration(ElasticJobEventRdbProperties properties) {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(properties.getDriverClassName());
        dataSource.setUrl(properties.getUrl());
        dataSource.setUsername(properties.getUsername());
        dataSource.setPassword(properties.getPassword());
        dataSource.setMaxActive(properties.getMaxActive());
        dataSource.setMinIdle(properties.getMinIdle());
        dataSource.setInitialSize(properties.getInitialSize());
        dataSource.setTestOnBorrow(properties.getTestOnBorrow());
        dataSource.setValidationQuery(properties.getValidationQuery());
        dataSource.setConnectionProperties(properties.getConnectionProperties());
        try {
            dataSource.setFilters(properties.getFilters());
            dataSource.init();
        } catch (Exception e) {
            logger.error("ElasticJob Starter DruidDataSource init Exception e={}", e.getMessage());
            e.printStackTrace();
        }
        return (JobEventConfiguration)new JobEventRdbConfiguration((DataSource)dataSource);
    }

    @Bean(initMethod = "init")
    public ZookeeperRegistryCenter regCenter(RegCenterProperties regCenterProperties) {
        return new ZookeeperRegistryCenter(new ZookeeperConfiguration(regCenterProperties.getServerList(), regCenterProperties.getNamespace()));
    }
}

ElasticConfigHelper

package com.elasticjob.spring.boot.autoconfigure;

import com.dangdang.ddframe.job.api.ElasticJob;
import com.dangdang.ddframe.job.api.dataflow.DataflowJob;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.dangdang.ddframe.job.config.JobCoreConfiguration;
import com.dangdang.ddframe.job.config.JobTypeConfiguration;
import com.dangdang.ddframe.job.config.dataflow.DataflowJobConfiguration;
import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration;
import com.dangdang.ddframe.job.event.JobEventConfiguration;
import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;
import com.dangdang.ddframe.job.lite.spring.api.SpringJobScheduler;
import com.dangdang.ddframe.job.reg.base.CoordinatorRegistryCenter;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;

import javax.annotation.Resource;

/**
* created by xiao.lizi 2020/5/26 16:02
*/
public class ElasticConfigHelper {

  @Resource
  private ZookeeperRegistryCenter regCenter;

  @Resource
  private JobEventConfiguration jobEventConfiguration;

  private LiteJobConfiguration getSimpleJobConfiguration(Class<? extends SimpleJob> jobClass, String cron, int shardingTotalCount, String shardingItemParameters) {
      JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder(jobClass.getName(), cron, shardingTotalCount).shardingItemParameters(shardingItemParameters).build();
      SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(jobCoreConfiguration, jobClass.getCanonicalName());
      return LiteJobConfiguration.newBuilder((JobTypeConfiguration)simpleJobConfiguration).overwrite(true).build();
  }

  private LiteJobConfiguration getDataflowConfiguration(Class<? extends DataflowJob> jobClass, String cron, int shardingTotalCount, String shardingItemParameters, boolean streamingProcess) {
      JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder(jobClass.getName(), cron, shardingTotalCount).shardingItemParameters(shardingItemParameters).build();
      DataflowJobConfiguration simpleJobConfiguration = new DataflowJobConfiguration(jobCoreConfiguration, jobClass.getCanonicalName(), streamingProcess);
      return LiteJobConfiguration.newBuilder((JobTypeConfiguration)simpleJobConfiguration).overwrite(true).build();
  }

  public void initSimpleJobScheduler(SimpleJob simpleJob, String cron, int shardingTotalCount, String shardingItemParameters) {
      (new SpringJobScheduler((ElasticJob)simpleJob, (CoordinatorRegistryCenter)this.regCenter, getSimpleJobConfiguration((Class)simpleJob.getClass(), cron, shardingTotalCount, shardingItemParameters), this.jobEventConfiguration, new com.dangdang.ddframe.job.lite.api.listener.ElasticJobListener[0]))
              .init();
  }

  public void initDataflowScheduler(DataflowJob dataflowJob, String cron, int shardingTotalCount, String shardingItemParameters, boolean streamingProcess) {
      (new SpringJobScheduler((ElasticJob)dataflowJob, (CoordinatorRegistryCenter)this.regCenter, getDataflowConfiguration((Class)dataflowJob.getClass(), cron, shardingTotalCount, shardingItemParameters, streamingProcess), this.jobEventConfiguration, new com.dangdang.ddframe.job.lite.api.listener.ElasticJobListener[0]))
              .init();
  }
}

ElasticJobEventRdbProperties

package com.elasticjob.spring.boot.autoconfigure;

import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* created by xiao.lizi  2020/5/26 16:10
*/

@ConfigurationProperties(prefix = "elasticjob.datasource")
public class ElasticJobEventRdbProperties {
  private String driverClassName;
  
  private String url;

  private String username;

  private String password;

  private int maxActive;

  private int minIdle;

  private int initialSize;

  private boolean testOnBorrow;

  private String validationQuery;

  private String connectionProperties;

  private String filters;
  // ...get set methon

RegCenterProperties

	package com.elasticjob.spring.boot.autoconfigure;

import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * created by ling.haidi 2020/5/26 16:05
 */
@ConfigurationProperties(prefix = "elasticjob.regCenter")
public class RegCenterProperties {
	/**
	 * 注册中心地址
	 */
    private String serverList;
	
    private String namespace;

    // ...get set methon
}

三、封装starter.jar

    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>elasticjob-spring-boot-autoconfigure</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>

在acutoconfigure–>resource下面新建META-INF/spring.factories

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.elasticjob.spring.boot.autoconfigure.ElasticJobAutoConfiguration

最终目录结构为:
在这里插入图片描述

使用

1、打包成新jar进私服或本地仓库
2、添加依赖

       <dependency>
            <groupId>org.example</groupId>
            <artifactId>elasticjob-spring-boot-autoconfigure</artifactId>
            <version>1.0.0</version>
        </dependency>

3、配置文件添加配置

elasticjob:
  regCenter:
    server-list: zk1:2181,zk2:2181,zk3:2181
  datasource:
    url:localhost:3306/elasticjo?useUnicode=true&characterEncoding=utf-8&verifyServerCertificate=false&useSSL=false&requireSSL=false
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: root
    max-active: 10
    min-idle: 5
    initial-size: 5
    test-on-borrow: true
    validation-query: SELECT 1

datasource是可选项

4、job使用

import com.elasticjob.spring.boot.autoconfigure.ElasticConfigHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * created by xiao.lizi 2020/5/26 10:38
 */
@Configuration
public class SimpleJobConfig {
    @Autowired
    private ElasticConfigHelper elasticConfigHelper;


    @Bean
    public SpringBootJob simpleJobScheduler( @Value("${simpleJob.testJob.cron}") final String cron,
                                           @Value("${simpleJob.testJob.shardingTotalCount}") final int shardingTotalCount,
                                           @Value("${simpleJob.testJob.shardingItemParameters}") final String shardingItemParameters) {
        SpringBootJob springBootJob = new SpringBootJob();
        elasticConfigHelper.initSimpleJobScheduler( springBootJob, cron, shardingTotalCount, shardingItemParameters );
        return  springBootJob;
    }    
}

job类只要继承SimpleJob即可

public class SpringBootJob implements SimpleJob {
    @Override
    public void execute(ShardingContext shardingContext) {
        System.out.println(">>>>>>>>>>>>>>>>>>>" + shardingContext + "<<<<<<<<<<<<<<<<<<<<<<");
    }
}

备注

elasticJob官方2.1.5版本中有个bug
JobEventRdbStorage.getOriginalTaskId,只需要取一条结果,如结果集很大,会严重影响数据库性能,虽然已有人修改提交 代码,但是未合并到官方版本中。
在这里插入图片描述
在这里插入图片描述
源码地址:https://github.com/lhd311/elastic-job/tree/master

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值