elastic-job整合spring boot以后分片的操作代码

elastic-job作为分布式定时任务框架,里面有一个非常重要的功能就是分片,将一个任务进行分片以后,这个任务就可以在不同的服务器上进行均摊执行,这里的分片均摊执行是数据的分片均摊执行。例如:10条数据,分5片,而程序又部署到两台服务器上,此时一台服务器会分道三个分片,另一台服务器就会分到2个分片。 而每个分片可以分到两条数据,所以有就是一台服务器执行6条数据、另一台服务器执行4条数据。这样就实现了定时任务的分布式执行。

下面是代码:

@Slf4j
@Component
public class GetAssetWhiteId implements SimpleJob {

	@Autowired
	EntityDao entityDao;//获取资产白名单审核状态
	
	@Override
	public void execute(ShardingContext shardingContext) {
		List strMacList = new ArrayList();
		
		// 当前服务器所在的任务分片下标
		int shardingItem = shardingContext.getShardingItem();
		// 总运行的任务分片总数
		int total = shardingContext.getShardingTotalCount();
		// 数据库表中有多少数据
		int counts = entityDao.selectEntityCount();
		// 每各分片需要查询的数据
		List entityList = null;
		// 数据总数要大于分片数据,且分片总数大于1时,采用根据分片下标分页查询,否则分片下标为0的获取所有数据,其他分片不获取数据
		if (counts >= total && total >1) {
			Map params = new HashMap();
			// 平均分页多少条数据
			int pageSize = new BigDecimal(counts / total).setScale(0).intValue();
			log.info("--------pageSize-------1------" + pageSize);
			// 将这个放到这里是其他的分片都按照这个进行,不考虑没有正好平均分配的情况
			params.put("offsetNum", shardingItem * pageSize);
			// 当多出的数据加给最后一个分片
			if (counts % total >0 && shardingItem == (total -1)) {
				pageSize = pageSize + counts % total;
				log.info("--------pageSize-------2------" + pageSize);
			}
			params.put("pageSize", pageSize);
			// 每个分片要查询的数据
			entityList = entityDao.selectEntityPage(params);
		}else {
			// 分片下标为0的获取所有数据,其他分片不获取数据
			entityList = entityDao.selectEntity();
		}
		
		
		/***********************下面就是每隔分片要进行的操作逻辑代码*******************************************/
if (null != listResult && !listResult.isEmpty()) {
	log.info("-----开始执行时间:" + new Date() + "-----");
	 log.info("数据库数据总数:" + counts);
	log.info(shardingContext.getJobName() + "任务分片下标:" + shardingItem);
	log.info("任务分片总数:" + total);
	log.info("要处理的数据:" + listResult);
	log.info("===========线程为===========" + Thread.currentThread().getId());
}

 

你可能感兴趣的:(spring,boot)