锁的使用例子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);
}