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();
            }
        }
相关推荐
月夜星辉雪1 小时前
【RabbitMQ 项目】服务端:路由交换模块
分布式·rabbitmq
super_journey1 小时前
RabbitMq中交换机(Exchange)、队列(Queue)和路由键(Routing Key)
分布式·中间件·rabbitmq
灰色孤星A3 小时前
分布式事务学习笔记(二)Seata架构、TC服务器部署、微服务集成Seata
分布式·微服务·架构·seata·分布式事务·tc服务器·微服务集成seata
MinIO官方账号4 小时前
从 HDFS 迁移到 MinIO 企业对象存储
人工智能·分布式·postgresql·架构·开源
丁总学Java4 小时前
maxwell 输出消息到 kafka
分布式·kafka·maxwell
喜欢猪猪6 小时前
深度解析ElasticSearch:构建高效搜索与分析的基石原创
分布式
蘑菇蘑菇不会开花~7 小时前
分布式Redis(14)哈希槽
redis·分布式·哈希算法
问道飞鱼8 小时前
分布式中间件-Pika一个高效的分布式缓存组件
分布式·缓存·中间件
小宋102110 小时前
玩转RabbitMQ声明队列交换机、消息转换器
服务器·分布式·rabbitmq
懒洋洋的华36915 小时前
消息队列-Kafka(概念篇)
分布式·中间件·kafka