锁的使用例子tryLock

点击查看代码
 @Async("dataExternalRetryAsync")
    public void takeExternalDataStart(DataQueryRecord queryRecord) {
        log.info("征信取数任务子线程开始执行,线程名:{},时间:{}", Thread.currentThread().getName(), new Date());
        try {
            if (StringUtil.isEmpty(queryRecord) || StringUtil.isStrEmpty(queryRecord.getRequestParam()) || StringUtil.isStrEmpty(queryRecord.getDataType())
                    || StringUtil.isStrEmpty(queryRecord.getBusinessNumber()) || StringUtil.isStrEmpty(queryRecord.getQueryState()) || queryRecord.getCreateDate() == null) {
                return;
            }
            if (!redisService.tryLock(EnumCommon.RedisKey.TAKE.getValue() + queryRecord.getId(), Long.valueOf(EnumCommon.Num.NUM_100001.getValue()))) {
                log.info("获取锁失败:{}", EnumCommon.RedisKey.TAKE.getValue() + queryRecord.getId());
                return;
            }

            log.info("xxl-job执行外部取数任务异步Async:{}", queryRecord);
            String requestParam = queryRecord.getRequestParam();
            CreateReportDTO createReportDTO = JSONObject.parseObject(requestParam, CreateReportDTO.class);
            createReportDTO.setRecordId(queryRecord.getId());

            DataService dataService = dataQueryRecordService.getNewDataService(queryRecord.getDataType());
            if (dataService != null) {
                dataService.createReport(createReportDTO);
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("外部取数任务执行接口异常:{}", e);
            queryRecord.setQueryTime(queryRecord.getQueryTime() + EnumCommon.Num.NUM_1.getValue());
            queryRecord.setResponseParam(e.toString());
            queryRecord.setQueryState(EnumCommon.ReportStatus.ERROR.getValue());
            dataQueryRecordMapper.updateById(queryRecord);
            //发送邮件
            dataQueryRecordService.sendFailRecordEmail(queryRecord.getBusinessNumber());
            return;
        } finally {
            redisService.deleteObject(EnumCommon.RedisKey.TAKE.getValue() + queryRecord.getId());
        }
    }
点击查看代码
  public boolean tryLock(final String key, Long expireTime) {
        try {
            ValueOperations<String, Object> operations = redisTemplate.opsForValue();
            //判断是否存在key
            if(operations.setIfAbsent(key, expireTime)) {
                log.info("获取锁:[{}]",key);
                return redisTemplate.expire(key, expireTime, TimeUnit.MILLISECONDS );
            }
            log.info("获取锁失败:[{}]",key);
            return false;
        } catch (Exception e) {
            log.error("系统异常,写入缓存失败,key:" + key + ", value: " + 0 + "expireTime: " + expireTime + "; 异常信息: " + e.getMessage());
            return false;
        }
    }

/**
* 删除单个对象
*
* @param key
*/
public boolean deleteObject(final String key)
{
log.info("释放锁:{}",key);
return redisTemplate.delete(key);
}

posted @ 2023-05-17 13:32  我的心儿  阅读(16)  评论(0)    收藏  举报