最近一个项目中用到了加锁,便简单记录一下,因为这个系统不需要用到集群,所以这里没啥影响,用的是比较简便的方法,网上也有用到分布式锁,将锁放在redis上,每次请求去redis 获取锁的状态,从而解决了集群下加锁的问题。下次有用到分布式锁,再来更新此文章!
代码实现
@RequestMapping(value = "/level")
public class CustomerLevelCalculationController {
private final Lock lock = new ReentrantLock();
/**
* 手动等级计算
*/
@PostMapping("/Calculation")
public BaseResponse customerManualLevelCalculation(@RequestBody BaseRequest<ManualCalculationRecordsDto> request) {
try {
//尝试获取锁,等待一段时间后还是获取不到再返回false
if (lock.tryLock(1, TimeUnit.SECONDS)) {
try {
return calculationService.manualCalculation(request);
} finally {
lock.unlock();
}
} else {
log.info("手动客户等级计算,正在更新中");
return BaseResponse.error(request.getHeaders(), "当前全量客户等级计算更新中不可再进行更新,请等待完成后进行操作");
}
} catch (InterruptedException e) {
log.error("手动客户等级计算异常:" + e.getMessage());
return BaseResponse.error(request.getHeaders(), "手动客户等级计算异常:" + e.getMessage());
}
}
}