Easy-Es框架异步分页查询问题记录

最近在做导出excel优化,就把查询BD改成了查ES,并且使用了线程池。就出现了导出数据的条数对不上的问题。最终发现easy-es在分页的时候往传入的wrapper中设置的from和size,由于使用线程池传入的wrapper是同一个就出现了数据安全问题,所有就此记录一下问题,在使用线程池时一定要注意线程安全。

// 这是Easy-Es框架封装的分页查询方法
 public EsPageInfo<T> pageQuery(Wrapper<T> wrapper, Integer pageNum, Integer pageSize) {
        // 兼容分页参数
        pageNum = pageNum == null || pageNum <= BaseEsConstants.ZERO ? BaseEsConstants.PAGE_NUM : pageNum;
        pageSize = pageSize == null || pageSize <= BaseEsConstants.ZERO ? BaseEsConstants.PAGE_SIZE : pageSize;

        wrapper.from = (pageNum - 1) * pageSize;
        wrapper.size = pageSize;

        // 请求es获取数据
        SearchResponse response = getSearchResponse(wrapper);

        // 解析数据
        SearchHit[] searchHits = parseSearchHitArray(response);
        List<T> dataList = Arrays.stream(searchHits)
                .map(searchHit -> parseOne(searchHit, wrapper))
                .collect(Collectors.toList());
        long count = parseCount(response, Objects.nonNull(wrapper.distinctField));
        return PageHelper.getPageInfo(dataList, count, pageNum, pageSize);
    }
ambdaEsQueryWrapper<BizEsWaybillEntity> countWrapper = new LambdaEsQueryWrapper<>();
			getEsQueryParam(query,countWrapper);
			Long countTime = System.currentTimeMillis();
			Integer totalCount = esWaybillMapper.selectCount(countWrapper).intValue();
			log.info("查询es运单总条数:{}条,耗时:{}毫秒",totalCount, System.currentTimeMillis() - countTime);
			totalNum = totalCount / pageSize + 1;
			if (totalNum > 1) {
				List<CompletableFuture<Integer>> futureList = new ArrayList<>();
				ExcelWriter finalExcelWriter = excelWriter;
				for (Integer i = 0; i < totalNum; i++) {
					Integer finalI = i + 1;
					CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
					
						// easy-es中的分页参数是往传入的wrapper中赋值,所有使用线程池并发每次查询都需要传入新的wrapper
						LambdaEsQueryWrapper<BizEsWaybillEntity> wrapper = new LambdaEsQueryWrapper<>();
						getEsQueryParam(query,wrapper);
						List<BizEsWaybillEntity> bizWaybillVos = getBizEsWaybillEntities(wrapper, finalI, pageSize, finalExcelWriter, writeSheet);
					
						return CollectionUtils.isNotEmpty(bizWaybillVos) ? bizWaybillVos.size() : 0;
					}, downloadTaskExecutor);

					futureList.add(future);
				}
				// 等待所有任务完成
				allOf(futureList, startTime);
			} else {
				List<BizEsWaybillEntity> bizWaybillVos = getBizEsWaybillEntities(countWrapper, 1, pageSize, excelWriter, writeSheet);
				log.info("导出运单数量:{},耗时:{}", bizWaybillVos.size(), System.currentTimeMillis() - startTime);
			}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值