redis分布式锁

事例:

 public void updateArchiveByIdsAndDeleteResumeForFactoryContract(List<VeWmsArchivesCustomDTO> veWmsArchives, List<Long> resumeIds) {
        log.info("********************Provider层更新回滚整机档案耦合/锁定状态以及是否签署厂家合同状态自定义传输对象******************** veWmsArchives={}", veWmsArchives);

        AssertUtil.isEmpty(veWmsArchives, VEHICLE_ARCHIVE_NOT_EXIST);

        // 循环加锁修改整机档案
        log.info("********************Provider层更新回滚整机档案耦合/锁定状态以及是否签署厂家合同状态开始******************** veWmsArchives={}", veWmsArchives);
        veWmsArchives.forEach(veWmsArchive -> {
            String vin = veWmsArchive.getVin();
            if (JinhuiStringUtil.isBlank(vin)) {
                return;
            }
            Long id = veWmsArchive.getId();
            RLock lock = redissonClient.getLock(CrmLockConstant.VEHICLE_ARCHIVE_VIN_KEY + vin);
            log.info("********************Provider层更新回滚整机档案耦合/锁定状态以及是否签署厂家合同状态 creating a RedissonLock lockName: {}, lock: {}, interrupted: {}, hold: {}, threadId: {}, 涉及vin: {}********************", lock.getName(), lock, Thread.currentThread().isInterrupted(), lock.isHeldByCurrentThread(), Thread.currentThread().getId(), vin);
            boolean leaseFlag = false;
            try {
                //释放时间必须合理化,设置不合理导致释放锁抛异常
                boolean flag = lock.tryLock(CrmLockConstant.VEHICLE_ORDER_COUPLING_WAIT_TIME, CrmLockConstant.VEHICLE_ORDER_COUPLING_LEASE_TIME, TimeUnit.MILLISECONDS);
                log.info("********************Provider层更新回滚整机档案耦合/锁定状态以及是否签署厂家合同状态 trying a RedissonLock lockName: {}, lock: {}, interrupted: {}, hold: {}, threadId: {}, flag: {}, 涉及vin: {}********************", lock.getName(), lock, Thread.currentThread().isInterrupted(), lock.isHeldByCurrentThread(), Thread.currentThread().getId(), flag, vin);
                if (!flag) {
                    log.error("********************Provider层更新回滚整机档案耦合/锁定状态以及是否签署厂家合同状态 Redisson分布式锁获取失败 lock: {}, 涉及vin: {}********************", lock, vin);
                    throw new BusinessException(VIN_OCCUPIED);
                }

                VeWmsArchivesDTO veWmsArchivesDto = new VeWmsArchivesDTO();
                veWmsArchivesDto.setId(id);
                veWmsArchivesDto.setCouplingFlag(veWmsArchive.getCouplingFlag()).setStatus(veWmsArchive.getStatus())
                        .setFirstSalesDate(veWmsArchive.getFirstSalesDate()).setContractSignStatus(veWmsArchive.getContractSignStatus());
                veWmsArchivesService.updateCouplingFlagAndContractSignStatusById(veWmsArchivesDto);

                if (lock.isLocked() && lock.isHeldByCurrentThread()) {
                    lock.unlock();
                    log.info("********************Provider层更新回滚整机档案耦合/锁定状态以及是否签署厂家合同状态 unlocking a RedissonLock lockName: {}, lock: {}, interrupted: {}, hold: {}, threadId: {}, 涉及vin: {}********************", lock.getName(), lock, Thread.currentThread().isInterrupted(), lock.isHeldByCurrentThread(), Thread.currentThread().getId(), vin);
                    leaseFlag = true;
                }
            } catch (InterruptedException e) {
                log.error("********************Provider层更新回滚整机档案耦合/锁定状态以及是否签署厂家合同状态 Redisson分布式锁出现中断异常 lockName: {} lock: {}, 涉及vin: {}********************", lock.getName(), lock, vin);
                Thread.currentThread().interrupt();
                throw new BusinessException(VIN_COUPLING_FAILED);
            } catch (Exception e) {
                log.error("********************Provider层更新回滚整机档案耦合/锁定状态以及是否签署厂家合同状态出现业务异常 archiveId: {}, 涉及vin: {}********************", id, vin, e);
                throw new BusinessException(e.getMessage());
            } finally {
                if (!leaseFlag) {
                    lock.unlock();
                    log.info("********************Provider层更新回滚整机档案耦合/锁定状态以及是否签署厂家合同状态 unlocking a RedissonLock lockName: {}, lock: {}, interrupted: {}, hold: {}, threadId: {}, 涉及vin: {}********************", lock.getName(), lock, Thread.currentThread().isInterrupted(), lock.isHeldByCurrentThread(), Thread.currentThread().getId(), vin);
                }
            }
        });
        log.info("********************Provider层更新回滚整机档案耦合/锁定状态以及是否签署厂家合同状态结束******************** veWmsArchives={}", veWmsArchives);

        veWmsResumeService.removeByIds(resumeIds);
    }

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值