和上文的rabbitmq一样,平时比较忙于,没时间弄csdn的各种格式,我直接cv我的笔记了,建议直接看我的笔记链接,有问题可以留言问我:
文档:Elastic-job.note
链接:http://note.youdao.com/noteshare?id=ecc3e53b88cfbe76740c5af59ee7da18&sub=WEB2e82af9c39bdd7e2ce184b21552415b8
官网地址:https://shardingsphere.apache.org/elasticjob/legacy/lite-2.x/00-overview/intro/
建议将分片项设置为大于服务器的数量,最好是大于服务器倍数的数量,作业将会合理的利用分布式资源,动态的分配分片项。例如:3台服务器,分成10片,则分片项分配结果为服务器A=0,1,2;服务器B=3,4,5;服务器C=6,7,8,9。 如果服务器C崩溃,则分片项分配结果为服务器A=0,1,2,3,4;服务器B=5,6,7,8,9。在不丢失分片项的情况下,最大限度的利用现有资源提高吞吐量。
实现简单任务接口,重写execute方法:
springboot整合Elastic-job:
目录结构:
TaskCreateListener:定时任务监听:
@Slf4j
public class TeYYYListener implements ElasticJobListener {
@Override
public void beforeJobExecuted(ShardingContexts shardingContexts) {
log.info("执行了y自定义的job的 aaaaaaaaaaaaa before");
}
@Override
public void afterJobExecuted(ShardingContexts shardingContexts) {
log.info("执行了y自定义的job的 aaaaaaaaaaaaaa after");
}
}
TaskCreateScheduler:作业处理配置
@Configuration
public class TeSchedulerssss {
@Resource
private ZookeeperRegistryCenter regCenter;
@Resource
private JobEventConfiguration jobEventConfiguration;
@Bean
public TeTask teTask() {
return new TeTask();
}
@Bean(initMethod = "init")
public JobScheduler te(final TeTask task, @Value("${job.shardingTotalCount.one}") final int shardingTotalCount){
//5秒
final String cron = "0/5 * * * * ? *";
return new SpringJobScheduler(task, regCenter, createSimpleJobConfiguration(task.getClass(), cron, shardingTotalCount), jobEventConfiguration, new TeYYYListener());
}
// Simple类型作业配置
private LiteJobConfiguration createSimpleJobConfiguration(final Class<? extends SimpleJob> jobClass, final String cron, final int shardingTotalCount) {
// 定义作业核心配置
JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration
.newBuilder(jobClass.getName(), cron, shardingTotalCount)
.failover(true)
.misfire(true)
//.shardingItemParameters("0=A,1=B")
.build();
// 定义SIMPLE类型配置
SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, jobClass.getCanonicalName());
// 定义Lite作业根配置
LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration
.newBuilder(simpleJobConfig)
//.jobShardingStrategyClass(SHARDINGSTRATEGY) // 可以不配置:默认如此
.build();
return simpleJobRootConfig;
}
}
TaskCreateTask:定时任务的具体执行流程:
@Slf4j
public class TaskCreateTask implements SimpleJob {
@Resource
TemplateMapper templateMapper;
@Resource
RUnitMapper rUnitMapper;
@Resource
TaskCreateMapper taskCreateMapper;
@Override
public void execute(ShardingContext shardingContext) {
// 查询任务的具体执行流程-->>注意,一定要实现SimpleJob [或者其他两个类型]]接口才行
}
yml配置:
job:
shardingTotalCount:
test: 2
notOnlineVehicle: 1
one: 1
JobEventConfig: [ 数据源配置:配置 ]
@Configuration
public class JobEventConfig {
@Resource
private DataSource dataSource;
@Bean
public JobEventConfiguration jobEventConfiguration() {
return new JobEventRdbConfiguration(dataSource);
}
}
RegistryCenterConfig: [ zk的配置: ]
@Configuration
@ConditionalOnExpression("’${zk.serverList}’.length() > 0")
public class RegistryCenterConfig {
@Bean(initMethod = “init”)
public ZookeeperRegistryCenter regCenter(@Value("
z
k
.
s
e
r
v
e
r
L
i
s
t
"
)
f
i
n
a
l
S
t
r
i
n
g
s
e
r
v
e
r
L
i
s
t
,
@
V
a
l
u
e
(
"
{zk.serverList}") final String serverList, @Value("
zk.serverList")finalStringserverList,@Value("{zk.namespace}") final String namespace) {
ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration(serverList, namespace);
zookeeperConfiguration.setBaseSleepTimeMilliseconds(1000);
zookeeperConfiguration.setMaxSleepTimeMilliseconds(3000);
zookeeperConfiguration.setMaxRetries(10);
zookeeperConfiguration.setSessionTimeoutMilliseconds(60000);
zookeeperConfiguration.setConnectionTimeoutMilliseconds(60000);
return new ZookeeperRegistryCenter(zookeeperConfiguration);
}
}
elastic-job分片设置:
分为4片,第0片的作业会带一个text的参数,1会带一个image的参数,2,3同理
而在execute中是可以拿到这些参数的:
就可以在进行后续操作的时候通过这些参数来进行后续的操作【eg:操作mysql的时候通过分片时携带的参数来限制对数据库进行的操作是不会重复操作的,也就是说,这是一种人为的限制分片后的作业通过参数的不一致来达到分片的防止重复操作】
作业的分片策略:
配置分片策略:
流式作业【之前的是简单作业】:
适用于最数据的连续性和实时性有要求的场景