commit
fa486b2b72
@ -0,0 +1,47 @@
|
||||
# Created by .ignore support plugin (hsz.mobi)
|
||||
### Java template
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
|
||||
### Example user template template
|
||||
### Example user template
|
||||
|
||||
# IntelliJ project files
|
||||
.idea
|
||||
*.iml
|
||||
out
|
||||
gen
|
||||
### Maven template
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
|
@ -0,0 +1,7 @@
|
||||
## 自动提示配置信息参考
|
||||
https://docs.spring.io/spring-boot/docs/2.3.11.RELEASE/reference/html/appendix-configuration-metadata.html#configuration-metadata-annotation-processor-metadata-generation
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.example</groupId>
|
||||
<artifactId>elastic-job-springboot</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<version>2.3.2.RELEASE</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<version>2.3.2.RELEASE</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||
<optional>true</optional>
|
||||
<version>2.3.2.RELEASE</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.16</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.dangdang</groupId>
|
||||
<artifactId>elastic-job-lite-core</artifactId>
|
||||
<version>2.1.5</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
@ -0,0 +1,15 @@
|
||||
package com.example.application;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
/**
|
||||
* @author q
|
||||
*/
|
||||
@SpringBootApplication
|
||||
public class SpringBootElaticjobApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(SpringBootElaticjobApplication.class, args);
|
||||
}
|
||||
}
|
@ -0,0 +1,71 @@
|
||||
package com.example.application.job;
|
||||
|
||||
import com.dangdang.ddframe.job.api.ShardingContext;
|
||||
import com.dangdang.ddframe.job.api.dataflow.DataflowJob;
|
||||
import com.example.autoconfig.ElatisDataflowJob;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author q
|
||||
*/
|
||||
@Slf4j
|
||||
@ElatisDataflowJob(
|
||||
jobName = "MyDataflowJob",
|
||||
cron = "0/3 * * * * ?",
|
||||
shardingTotalCount = 2,
|
||||
overwrite = true,
|
||||
streamingProcess = true,
|
||||
jobEvent = false
|
||||
)
|
||||
public class MyDataflowJob implements DataflowJob<Integer> {
|
||||
|
||||
private List<Integer> list;
|
||||
|
||||
{
|
||||
list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
|
||||
}
|
||||
@Override
|
||||
public List<Integer> fetchData(ShardingContext shardingContext) {
|
||||
|
||||
List<Integer> result = new ArrayList<>();
|
||||
|
||||
// 数字 % 分片总数 == 当前分片数
|
||||
for (Integer index : list) {
|
||||
if (index % shardingContext.getShardingTotalCount() == shardingContext.getShardingItem()){
|
||||
result.add(index);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 模拟处理时间耗时
|
||||
try {
|
||||
Thread.sleep(3000);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
log.info("我是分片项: {} , 我抓取的数据是: {} ",shardingContext.getShardingItem(), result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(ShardingContext shardingContext, List<Integer> result) {
|
||||
|
||||
// list.removeAll(result);
|
||||
|
||||
// 模拟处理时间耗时
|
||||
try {
|
||||
Thread.sleep(5000);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
log.info("我是分片项: {}, 我是处理的数据是: {}", shardingContext.getShardingItem(), result);
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package com.example.application.job;
|
||||
|
||||
import com.dangdang.ddframe.job.api.ShardingContext;
|
||||
import com.dangdang.ddframe.job.api.simple.SimpleJob;
|
||||
import com.example.autoconfig.ElasticSimpleJob;
|
||||
import com.example.autoconfig.sharding.MyshardingStrategy;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* 测试自定义分片策略的Job
|
||||
* @author q
|
||||
*/
|
||||
@Slf4j
|
||||
@ElasticSimpleJob(
|
||||
jobName = "MyShardingJob",
|
||||
cron = "0/3 * * * * ?",
|
||||
shardingTotalCount = 10,
|
||||
overwrite = true,
|
||||
jobStrategy = MyshardingStrategy.class,
|
||||
jobEvent = false
|
||||
)
|
||||
public class MyShardingJob implements SimpleJob {
|
||||
|
||||
|
||||
@Override
|
||||
public void execute(ShardingContext shardingContext) {
|
||||
log.info("{} : 我是分片项: {} , 总分片数 : {} ",
|
||||
this.getClass().getSimpleName(),
|
||||
shardingContext.getShardingItem(),
|
||||
shardingContext.getShardingTotalCount()
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package com.example.application.job;
|
||||
|
||||
import com.dangdang.ddframe.job.api.ShardingContext;
|
||||
import com.dangdang.ddframe.job.api.simple.SimpleJob;
|
||||
import com.example.autoconfig.ElasticSimpleJob;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* @author q
|
||||
*/
|
||||
@Slf4j
|
||||
@ElasticSimpleJob(
|
||||
jobName = "MySimpleJob",
|
||||
cron = "0/3 * * * * ?",
|
||||
shardingTotalCount = 2,
|
||||
overwrite = true,
|
||||
jobEvent = false
|
||||
)
|
||||
public class MySimpleJob implements SimpleJob {
|
||||
|
||||
@Override
|
||||
public void execute(ShardingContext shardingContext) {
|
||||
log.info("{} : 我是分片项: {} , 总分片数 : {} ",
|
||||
this.getClass().getSimpleName(),
|
||||
shardingContext.getShardingItem(),
|
||||
shardingContext.getShardingTotalCount()
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package com.example.application.job.listener;
|
||||
|
||||
import com.dangdang.ddframe.job.executor.ShardingContexts;
|
||||
import com.dangdang.ddframe.job.lite.api.listener.ElasticJobListener;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
||||
/**
|
||||
* @author q
|
||||
*/
|
||||
@Slf4j
|
||||
public class MyNormalListener implements ElasticJobListener{
|
||||
|
||||
/**
|
||||
* 作业执行前
|
||||
* @param shardingContexts
|
||||
*/
|
||||
@Override
|
||||
public void beforeJobExecuted(ShardingContexts shardingContexts) {
|
||||
log.info("我是 : {} 作业, 在方法前!", shardingContexts.getJobName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterJobExecuted(ShardingContexts shardingContexts) {
|
||||
log.info("我是 : {} 作业, 在方法后!", shardingContexts.getJobName());
|
||||
}
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
package com.example.autoconfig;
|
||||
|
||||
import com.dangdang.ddframe.job.api.dataflow.DataflowJob;
|
||||
import com.dangdang.ddframe.job.config.JobCoreConfiguration;
|
||||
import com.dangdang.ddframe.job.config.dataflow.DataflowJobConfiguration;
|
||||
import com.dangdang.ddframe.job.lite.api.JobScheduler;
|
||||
import com.dangdang.ddframe.job.lite.api.listener.ElasticJobListener;
|
||||
import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;
|
||||
import com.dangdang.ddframe.job.reg.base.CoordinatorRegistryCenter;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author q
|
||||
*/
|
||||
@Configuration
|
||||
@ConditionalOnBean(CoordinatorRegistryCenter.class)
|
||||
@AutoConfigureAfter(ZookeeperAutoConfig.class)
|
||||
public class DataflowJobAutoConfig {
|
||||
|
||||
@Autowired
|
||||
private CoordinatorRegistryCenter zkCenter;
|
||||
|
||||
@Autowired
|
||||
private ApplicationContext applicationContext;
|
||||
|
||||
@PostConstruct
|
||||
public void initDataflowJob(){
|
||||
Map<String, Object> beans = applicationContext.getBeansWithAnnotation(ElatisDataflowJob.class);
|
||||
beans.forEach((key, instance) -> {
|
||||
Class<?>[] interfaces = instance.getClass().getInterfaces();
|
||||
|
||||
for (Class<?> anInterface : interfaces) {
|
||||
if (anInterface == DataflowJob.class) {
|
||||
ElatisDataflowJob annotation = instance.getClass().getAnnotation(ElatisDataflowJob.class);
|
||||
|
||||
String jobName = annotation.jobName();
|
||||
String cron = annotation.cron();
|
||||
int shardingTotalCount = annotation.shardingTotalCount();
|
||||
boolean overwrite = annotation.overwrite();
|
||||
boolean process = annotation.streamingProcess();
|
||||
Class<?> jobStrategy = annotation.jobStrategy();
|
||||
Class<? extends ElasticJobListener>[] jobListeners = annotation.jobListeners();
|
||||
|
||||
// Job核心配置
|
||||
JobCoreConfiguration jcc = JobCoreConfiguration
|
||||
.newBuilder(jobName, cron, shardingTotalCount)
|
||||
.build();
|
||||
|
||||
// job类型配置
|
||||
DataflowJobConfiguration djc = new DataflowJobConfiguration(
|
||||
jcc,
|
||||
instance.getClass().getCanonicalName(),
|
||||
process
|
||||
);
|
||||
|
||||
// job根配置
|
||||
LiteJobConfiguration ljc = LiteJobConfiguration
|
||||
.newBuilder(djc)
|
||||
.jobShardingStrategyClass(jobStrategy.getCanonicalName())
|
||||
.overwrite(overwrite)
|
||||
.build();
|
||||
|
||||
new JobScheduler(zkCenter, ljc).init();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
package com.example.autoconfig;
|
||||
|
||||
import com.dangdang.ddframe.job.lite.api.listener.ElasticJobListener;
|
||||
import com.dangdang.ddframe.job.lite.api.strategy.impl.AverageAllocationJobShardingStrategy;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* @author q
|
||||
*/
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Component
|
||||
public @interface ElasticSimpleJob {
|
||||
|
||||
/**
|
||||
* 任务名称
|
||||
*/
|
||||
String jobName() default "";
|
||||
|
||||
/**
|
||||
* cron 表达式
|
||||
*/
|
||||
String cron() default "";
|
||||
|
||||
/**
|
||||
* 分片总数
|
||||
*/
|
||||
int shardingTotalCount() default 1;
|
||||
|
||||
/**
|
||||
* 是否刷新到Zookeeper
|
||||
*/
|
||||
boolean overwrite() default false;
|
||||
|
||||
/**
|
||||
* 使用的分片策略
|
||||
*/
|
||||
Class<?> jobStrategy() default AverageAllocationJobShardingStrategy.class;
|
||||
|
||||
/**
|
||||
* 是否使用事件追踪
|
||||
*/
|
||||
boolean jobEvent() default false;
|
||||
|
||||
/**
|
||||
* 是否使用事件监听器
|
||||
*/
|
||||
Class<? extends ElasticJobListener>[] jobListeners() default {};
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
package com.example.autoconfig;
|
||||
|
||||
import com.dangdang.ddframe.job.lite.api.listener.ElasticJobListener;
|
||||
import com.dangdang.ddframe.job.lite.api.strategy.impl.AverageAllocationJobShardingStrategy;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* @author q
|
||||
*/
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Component
|
||||
public @interface ElatisDataflowJob {
|
||||
|
||||
/**
|
||||
* 任务名称
|
||||
*/
|
||||
String jobName() default "";
|
||||
|
||||
/**
|
||||
* cron 表达式
|
||||
*/
|
||||
String cron() default "";
|
||||
|
||||
/**
|
||||
* 分片总数
|
||||
*/
|
||||
int shardingTotalCount() default 1;
|
||||
|
||||
/**
|
||||
* 是否刷新到Zookeeper
|
||||
*/
|
||||
boolean overwrite() default false;
|
||||
|
||||
/**
|
||||
* 是否流式处理
|
||||
*/
|
||||
boolean streamingProcess() default false;
|
||||
|
||||
/**
|
||||
* 使用的分片策略
|
||||
*/
|
||||
Class<?> jobStrategy() default AverageAllocationJobShardingStrategy.class;
|
||||
|
||||
/**
|
||||
* 是否使用事件追踪
|
||||
*/
|
||||
boolean jobEvent() default false;
|
||||
|
||||
/**
|
||||
* 是否使用事件监听器
|
||||
*/
|
||||
Class<? extends ElasticJobListener>[] jobListeners() default {};
|
||||
}
|
@ -0,0 +1,82 @@
|
||||
package com.example.autoconfig;
|
||||
|
||||
import com.dangdang.ddframe.job.api.simple.SimpleJob;
|
||||
import com.dangdang.ddframe.job.config.JobCoreConfiguration;
|
||||
import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration;
|
||||
import com.dangdang.ddframe.job.event.JobEventConfiguration;
|
||||
import com.dangdang.ddframe.job.event.rdb.JobEventRdbConfiguration;
|
||||
import com.dangdang.ddframe.job.lite.api.JobScheduler;
|
||||
import com.dangdang.ddframe.job.lite.api.listener.ElasticJobListener;
|
||||
import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;
|
||||
import com.dangdang.ddframe.job.reg.base.CoordinatorRegistryCenter;
|
||||
import com.example.autoconfig.sharding.MyshardingStrategy;
|
||||
import org.quartz.JobDetail;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.sql.DataSource;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author q
|
||||
*/
|
||||
@Configuration
|
||||
@ConditionalOnBean(CoordinatorRegistryCenter.class)
|
||||
@AutoConfigureAfter(ZookeeperAutoConfig.class)
|
||||
public class SimpleJobAutoConfig {
|
||||
|
||||
@Autowired
|
||||
private CoordinatorRegistryCenter center;
|
||||
|
||||
@Autowired
|
||||
private ApplicationContext applicationContext;
|
||||
|
||||
// @Autowired
|
||||
// private DataSource dataSource;
|
||||
|
||||
|
||||
@PostConstruct
|
||||
public void initSimpleJob(){
|
||||
Map<String, Object> beans = applicationContext.getBeansWithAnnotation(ElasticSimpleJob.class);
|
||||
|
||||
beans.forEach((key, instance) -> {
|
||||
Class<?>[] interfaces = instance.getClass().getInterfaces();
|
||||
for (Class<?> anInterface : interfaces) {
|
||||
if (anInterface == SimpleJob.class) {
|
||||
ElasticSimpleJob annotation = instance.getClass().getAnnotation(ElasticSimpleJob.class);
|
||||
String jobName = annotation.jobName();
|
||||
String cron = annotation.cron();
|
||||
int shardingTotalCount = annotation.shardingTotalCount();
|
||||
boolean overwrite = annotation.overwrite();
|
||||
Class<?> jobStrategy = annotation.jobStrategy();
|
||||
boolean jobEvent = annotation.jobEvent();
|
||||
Class<? extends ElasticJobListener>[] jobListeners = annotation.jobListeners();
|
||||
|
||||
JobCoreConfiguration jcc = JobCoreConfiguration
|
||||
.newBuilder(jobName, cron, shardingTotalCount)
|
||||
.build();
|
||||
|
||||
SimpleJobConfiguration sjc = new SimpleJobConfiguration(
|
||||
jcc,
|
||||
instance.getClass().getCanonicalName()
|
||||
);
|
||||
|
||||
LiteJobConfiguration ljc = LiteJobConfiguration
|
||||
.newBuilder(sjc)
|
||||
.jobShardingStrategyClass(jobStrategy.getCanonicalName())
|
||||
.overwrite(overwrite)
|
||||
.build();
|
||||
|
||||
// 配置数据源
|
||||
// JobEventConfiguration jec = new JobEventRdbConfiguration(dataSource);
|
||||
|
||||
new JobScheduler(center, ljc).init();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
package com.example.autoconfig;
|
||||
|
||||
import com.dangdang.ddframe.job.reg.base.CoordinatorRegistryCenter;
|
||||
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration;
|
||||
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
* 当有配置的时候就生效
|
||||
* @author q
|
||||
*/
|
||||
@ConditionalOnProperty("elasticjob.zookeeper.server-list")
|
||||
@Configuration
|
||||
@EnableConfigurationProperties(ZookeeperProperties.class)
|
||||
public class ZookeeperAutoConfig {
|
||||
|
||||
@Autowired
|
||||
private ZookeeperProperties zookeeperProperties;
|
||||
|
||||
/**
|
||||
* Zookeeper 注册中心自动装配
|
||||
* @return Zookeeper注册中心实例
|
||||
*/
|
||||
@Bean(initMethod = "init")
|
||||
public CoordinatorRegistryCenter zkCenter(){
|
||||
|
||||
ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration(
|
||||
zookeeperProperties.getServerList(),
|
||||
zookeeperProperties.getNamespace()
|
||||
);
|
||||
|
||||
ZookeeperRegistryCenter zookeeperRegistryCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);
|
||||
|
||||
return zookeeperRegistryCenter;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package com.example.autoconfig;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
|
||||
/**
|
||||
* Zookeeper properties
|
||||
* @author q
|
||||
*/
|
||||
@ConfigurationProperties(prefix = "elasticjob.zookeeper")
|
||||
@Setter
|
||||
@Getter
|
||||
public class ZookeeperProperties {
|
||||
|
||||
/**
|
||||
* Zookeeper 地址列表
|
||||
*/
|
||||
private String serverList;
|
||||
|
||||
/**
|
||||
* Zookeeper 命名空间
|
||||
*/
|
||||
private String namespace;
|
||||
|
||||
// TODO: 2021/6/2 0002 其他的属性在这里进行配置即可
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
package com.example.autoconfig.sharding;
|
||||
|
||||
import com.dangdang.ddframe.job.lite.api.strategy.JobInstance;
|
||||
import com.dangdang.ddframe.job.lite.api.strategy.JobShardingStrategy;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 自定义分片策略 - 实现全轮询算法
|
||||
*
|
||||
* @author q
|
||||
*/
|
||||
public class MyshardingStrategy implements JobShardingStrategy {
|
||||
|
||||
|
||||
/**
|
||||
* @param jobInstances 所有有效的服务
|
||||
* @param jobName 作业名称
|
||||
* @param shardingTotalCount 分片总数
|
||||
* @return 实例 所获取的分片项
|
||||
*/
|
||||
@Override
|
||||
public Map<JobInstance, List<Integer>> sharding(List<JobInstance> jobInstances, String jobName, int shardingTotalCount) {
|
||||
|
||||
// 创建返回值容器
|
||||
Map<JobInstance, List<Integer>> rtnMap = new HashMap<>(10);
|
||||
|
||||
// 创建队列模型
|
||||
// fixme 这个队列可以自行进行选择
|
||||
ArrayDeque<Integer> queue = new ArrayDeque<>(shardingTotalCount);
|
||||
|
||||
for (int i = 0; i < shardingTotalCount; i++) {
|
||||
queue.add(i);
|
||||
}
|
||||
|
||||
// 轮询
|
||||
while (queue.size() > 0) {
|
||||
for (JobInstance jobInstance : jobInstances) {
|
||||
if (queue.size() > 0){
|
||||
Integer shardingItem = queue.pop();
|
||||
List<Integer> shardingItemList = rtnMap.get(jobInstance);
|
||||
if (CollectionUtils.isEmpty(shardingItemList)){
|
||||
ArrayList<Integer> list = new ArrayList<>(100);
|
||||
list.add(shardingItem);
|
||||
rtnMap.put(jobInstance, shardingItemList);
|
||||
}else {
|
||||
shardingItemList.add(shardingItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return rtnMap;
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
{
|
||||
"properties": [
|
||||
{
|
||||
"name": "elasticjob.zookeeper.namespace",
|
||||
"type": "java.lang.String",
|
||||
"description": "Zookeeper 命名空间",
|
||||
"sourceType": "com.example.autoconfig.ZookeeperProperties"
|
||||
},
|
||||
{
|
||||
"name": "elasticjob.zookeeper.server-list",
|
||||
"type": "java.lang.String",
|
||||
"description": "Zookeeper 服务列表",
|
||||
"sourceType": "com.example.autoconfig.ZookeeperProperties"
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
|
||||
com.example.autoconfig.ZookeeperAutoConfig,\
|
||||
com.example.autoconfig.DataflowJobAutoConfig,\
|
||||
com.example.autoconfig.SimpleJobAutoConfig
|
@ -0,0 +1,7 @@
|
||||
server:
|
||||
port: 8081
|
||||
|
||||
elasticjob:
|
||||
zookeeper:
|
||||
namespace: springboot-elasticjob
|
||||
server-list: 192.168.72.100:2181
|
Loading…
Reference in New Issue