redisson 释放分布式锁 踩坑

java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: 48c213c9-1945-4c1b-821e-6d32e347eb44 thread-id: 69

出错代码:

java 复制代码
   private void insertHourLog(Timestamp lastHourStartTimeStamp) {
        RLock lock = redissonClient.getLock("hourLogLock");
        try {
            if (lock.tryLock(70, TimeUnit.SECONDS)) {
                QueryWrapper<TdengineHourLog> tdengineHourLogQueryWrapper = new QueryWrapper<>();
                tdengineHourLogQueryWrapper.eq("belong_time", lastHourStartTimeStamp);
                TdengineHourLog tdengineHourLog = tdengineHourLogMapper.selectOne(tdengineHourLogQueryWrapper);
                LocalDateTime currentDateTime = LocalDateTime.now();
                if (tdengineHourLog != null) {
                    tdengineHourLog.setTotal(tdengineHourLog.getTotal() + 1);
                    String statusMapString = tdengineHourLog.getStatus_map();
                    if (StrUtil.isNotEmpty(statusMapString)) {
                        HashMap statusMap = JSONUtil.toBean(statusMapString, HashMap.class);
                        statusMap.put(basicConfig.nodeName, currentDateTime);
                        tdengineHourLog.setStatus_map(JSONUtil.toJsonStr(statusMap));
                        tdengineHourLogMapper.updateById(tdengineHourLog);
                        log.info("更新hourLog");
                    } else {
                        HashMap<String, Object> statusMap = new HashMap<>();
                        statusMap.put(basicConfig.nodeName, currentDateTime);
                        tdengineHourLog.setStatus_map(JSONUtil.toJsonStr(statusMap));
                        tdengineHourLogMapper.updateById(tdengineHourLog);
                        log.info("更新hourLog");
                    }
                } else {
                    tdengineHourLog = new TdengineHourLog();
                    tdengineHourLog.setBelong_time(lastHourStartTimeStamp);
                    tdengineHourLog.setTotal(1);
                    HashMap<String, Object> statusMap = new HashMap<>();
                    statusMap.put(basicConfig.nodeName, currentDateTime);
                    tdengineHourLog.setStatus_map(JSONUtil.toJsonStr(statusMap));
                    tdengineHourLogMapper.insert(tdengineHourLog);
                    log.info("新增hourLog");
                }
                lock.unlock();
            } else {
                log.info("60s超时未获取到hourLogLock");
            }
        } catch (InterruptedException e) {
            log.error("插入hour_log日志出错", e);
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

最后的finally中的 lock.unlock()存在一种情况,即未获取锁的情况下,调用了 unlock 解锁方法

在finally 中加入如下判断即可

java 复制代码
  finally {
            if (lock.isLocked() && lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
相关推荐
明达技术3 小时前
分布式 IO 模块携手 PLC,开启设备车间降本增效新篇章
分布式
Swift社区7 小时前
【分布式日志篇】从工具选型到实战部署:全面解析日志采集与管理路径
人工智能·spring boot·分布式
指尖下的技术9 小时前
Kafka面试题----Kafka消息是采用Pull模式,还是Push模式
分布式·kafka
Ciderw9 小时前
Go中的三种锁
开发语言·c++·后端·golang·互斥锁·
码至终章11 小时前
kafka常用目录文件解析
java·分布式·后端·kafka·mq
小马爱打代码11 小时前
Kafka-常见的问题解答
分布式·kafka
峰子201212 小时前
B站评论系统的多级存储架构
开发语言·数据库·分布式·后端·golang·tidb
weisian15112 小时前
消息队列篇--原理篇--Pulsar和Kafka对比分析
分布式·kafka
无锡布里渊12 小时前
分布式光纤应变监测是一种高精度、分布式的监测技术
分布式·温度监测·分布式光纤测温·厘米级·火灾预警·线型感温火灾监测·分布式光纤应变
40岁的系统架构师13 小时前
15 分布式锁和分布式session
分布式·系统架构