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