错过任务重执行:
ElasticJob 不允许作业在同一时间内叠加执行。 当作业的执行时长超过其运行间隔,错过任务重执行能够保证作业在完成上次的任务后继续执行逾期的作业
举例:作业分别于 12:00,13:00 和 14:00 执行,如果 12:00 开始执行的作业在 13:10 才执行完毕,那么本该由 13:00 触发的作业则错过了触发时间,需要等待至 14:00 的下次作业触发,在开启错过任务重执行功能之后,ElasticJob 将会在上次作业执行完毕后,立刻触发执行错过的作业
目前提供3
种作业类型,分别是Simple
, DataFlow
和Script
。
Simple:
@Slf4j
@Service
public class SimpleJobTest implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
//执行分片任务
long startTime = System.currentTimeMillis();
log.info("定时任务job:{}启动",shardingContext.getJobName());
//查询特定时间段内活动结束的批次账户
Date startDate = DateUtil.calBeginTimeForDay(-361L);
Date endDate = DateUtil.calEndTimeForDay(-361L);
batchCloseBiz.close(startDate,endDate);
log.info("定时任务job:{}结束,耗时{}ms", shardingContext.getJobName(),System.currentTimeMillis() - startTime);
}
}
DataFlow:
@Slf4j
@Component
public class SimpleJobTest implements DataflowJob<String>{
@Override
public List<String> fetchData(ShardingContext shardingContext) {
// 当前机器的分片编号
int shardingItem = shardingContext.getShardingItem();
// 定时器总的分片数
int shardingTotalCount = shardingContext.getShardingTotalCount();
//从数据库获取分片数据
List<UserDao> userDaoList= "sql语句获取数据待处理的数据集";
// 查看是否是需要本台机器处理的分片数据
userDaoList.stream().filter(userDao->
ShardingKit.getShrading(limitDetailBO.getId().toString(), shardingTotalCount) == shardingItem )
return date;
}
@Override
public void processData(ShardingContext shardingContext, List<String> data) {
//分片数据处理
}
}
/**
* 对id进去取模
* @param modKey 业务BO的取模字段
* @param shardKey 定时任务分片数
* @return
*/
public static Integer getShrading(String modKey,int shardKey){
return modKey.hashCode() & (shardKey - 1);
}
Script: