// 控制重复提交非 并发重复提交 如果觉得有问题这个方法可以删除 public void repeatSubmission(OiePersonalHeaders header, BindingResult errors) { User user = UserInfoUtils.getCurrentUser(); StringBuffer sb = new StringBuffer(); if (null == user || null == header) { return; } sb.append(user.getPersonId()).append("_").append(header.getExpHeaderId()); Long firstTimes = (Long) RedisUtil.vGet(sb.toString()); String lockObject = user.getPersonId() + "_" + header.getExpHeaderId(); if (null == firstTimes) { synchronized(lockObject) { Long firstTimes2 = (Long) RedisUtil.vGet(sb.toString()); if (firstTimes2 == null) { RedisUtil.vSetWithExpired(sb.toString(), new Date().getTime(), 30); return; } else { firstTimes = firstTimes2; } } } log.info("----------------" + (new Date().getTime() - firstTimes)); log.info("----------------" + lockObject); long afterTime = new Date().getTime(); long startTime = firstTimes.longValue(); if (afterTime - startTime <= 9000) { errors.reject("submit cf", "该单子正在提交中,请稍后"); log.error("该" + header.getExpHeaderId() + "报销单重复提交"); } }
使用String 来作为 同步锁减小锁的颗粒度,同时实现当前用户线程同步
最新推荐文章于 2023-04-14 16:20:43 发布