背景 项目组已经有个 分布式锁 注解(参考前文《记一次分布式锁注解化》),但是在设置锁过期时间时,需要去预估业务耗时时间,如果锁的过期时间能根据业务运行时间自动调整,那使用的就更方便了。
思路 思路参考了 redisson :
保留原先的可自定义设置过期时间,只有在 没有设置过期时间(过期时间为默认值 0) 的情况下,才会启动自动延长。申请锁时,设置一个 延长过期时间 ,定时每隔 延长过期时间 的三分之一时间就重新设置 过期时间 ( 时期时间 值为 延长过期时间 )。为了防止某次业务由于异常而出现 任务持续很久 ,从而长时间占有了锁,添加 最大延期次数 参数。加锁 用一个 Map 来存储需要续期的 任务信息 。在加锁成功之后将 任务信息 放入 Map ,并启动延迟任务,延迟任务在执行 延期动作 前先检查下 Map 里锁数据是不是还是被当前任务持有。每次续期任务完成并且成功之后,就再次启动延迟任务。申请锁 复用之前的 加锁 方法,把 延长过期时间 作为 加锁过期时间 。
public Lock acquireAndRenew(String lockKey, String lockValue, int lockWatchdogTimeout) {
return acquireAndRenew(lockKey, lockValue, lockWatchdogTimeout, 0);
}
public Lock acquireAndRenew(String lockKey, String lockValue, int lockWatchdogTimeout, int maxRenewTimes) {
if (lockKey == null || lockValue == null || lockWatchdogTimeout <= 0) {<