作者: whooyun发表于: 2023-04-11 17:44
/** * 当需要调整品态的SKU比较多时,使用线程池提升处理效率 * * @param acvGdsAdjustStateList */ private void orgGdsAdjustState(List<AcvGdsAdjustState> acvGdsAdjustStateList) { if (!CollectionUtils.isEmpty(acvGdsAdjustStateList)) { ExecutorService executor = new ThreadPoolExecutor(5, 10, 5000L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(100), new ThreadPoolExecutor.CallerRunsPolicy()); log.info("品态调整,线程池创建成功:{}", executor); acvGdsAdjustStateList.forEach(item -> { AsyncAcvGdsAdjustStateGoodsTask task = new AsyncAcvGdsAdjustStateGoodsTask(); task.setAcvGdsAdjustState(item); executor.execute(task); }); executor.shutdown(); try { if (!executor.awaitTermination(10000, TimeUnit.MILLISECONDS)) { // 超时后强制关闭所有线程 executor.shutdownNow(); log.info("==>品态调整,线程池已关闭"); } } catch (InterruptedException e) { log.info("==>品态调整,线程池关闭异常:{}", e.getMessage()); e.printStackTrace(); } } }
==============================================
@Component public class AsyncAcvGdsAdjustStateGoodsTask implements Runnable{ @Autowired private AcvGdsAdjustStateMapper acvGdsAdjustStateMapper; @Autowired private AcvGdsAdjustStateGoodsMapper acvGdsAdjustStateGoodsMapper; @Autowired private AcvOrgGroupMapper acvOrgGroupMapper; @Autowired private AcvGdsStateMapper acvGdsStateMapper; @Autowired private AcvOrgGoodsMapper acvOrgGoodsMapper; //处理state的原子性和可见性问题 private final AtomicReference<AcvGdsAdjustState> stateRef = new AtomicReference<>();; public void setAcvGdsAdjustState(AcvGdsAdjustState state) { stateRef.set(state); } //业务无线程安全需求,所以run内的方法无需处理 @Override public void run() { //log.debug("==> 需要调整品态的机构单据:{}", item); AcvGdsAdjustState item = stateRef.get(); log.info("当前线程:"+Thread.currentThread().getName()+",拿到的参数:"+item); QueryWrapper orgGroupQuery = new QueryWrapper(); orgGroupQuery.eq("biz_uid", item.getBizUid()); List<AcvOrgGroup> acvOrgGroupList = acvOrgGroupMapper.selectList(orgGroupQuery); List<Integer> orgIdList = new ArrayList<>(); acvOrgGroupList.forEach(i -> { orgIdList.add(i.getGroupOrgId()); }); QueryWrapper stateGoodsQuery = new QueryWrapper(); stateGoodsQuery.eq("bill_id", item.getId()); List<AcvGdsAdjustStateGoods> stateGoodsList = acvGdsAdjustStateGoodsMapper.selectList(stateGoodsQuery); stateGoodsList.forEach(i -> { this.updateOrgGoodsState(Long.valueOf(i.getNewStatusDic()), i.getGoodsId(), orgIdList); }); AcvGdsAdjustState acvGdsAdjustState = new AcvGdsAdjustState(); acvGdsAdjustState.setId(item.getId()); ////状态,代码类型:1,代码值:1-草稿,2-审核中,3-待执行,4-已生效,5-已作废,6-已终止 acvGdsAdjustState.setBillStatusDic(CommonConstant.MATH_BYTE_4); acvGdsAdjustState.setModifiedDtm(LocalDateTime.now()); acvGdsAdjustStateMapper.updateById(acvGdsAdjustState); // log.info("==>品态调整单:{},处理完毕", acvGdsAdjustState); log.info("当前线程结束:"+Thread.currentThread().getName()+",拿到的参数:"+item); } /** * 修改机构商品状态 * * @param stateId * @param goodsId * @param idList */ private void updateOrgGoodsState(final long stateId, final long goodsId, final List idList) { AcvGdsState state = acvGdsStateMapper.selectById(stateId); UpdateWrapper stateUpdateWrapper = new UpdateWrapper(); stateUpdateWrapper.set("state_no", state.getStateNo()); stateUpdateWrapper.set("life_dic", state.getLifeDic()); stateUpdateWrapper.set("modified_dtm",LocalDateTime.now()); stateUpdateWrapper.eq("goods_id", goodsId); stateUpdateWrapper.eq("is_deleted", CommonConstant.MATH_1); stateUpdateWrapper.in("goods_org_id", idList); acvOrgGoodsMapper.update(new AcvOrgGoods(), stateUpdateWrapper); } }