当前位置: 首页 > news >正文

Kafka+redis分布式锁结合使用心得总结

#kafka部分

@KafkaListener(topics = "#{'${vsmart_alert_detection_tms_send_message_topic}'.split(',')}", groupId = "${vsmart.alert.detection.consumer.group}")
public void vsmartAlertDetectionTmsSendMessage(ConsumerRecord<?, ?> record, Acknowledgment ack, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
    doSendMessage(record,ack);
}

private void doSendMessage(ConsumerRecord<?, ?> record, Acknowledgment ack) {
    Optional message = Optional.ofNullable(record.value());
    String key = record.topic() + "-" + record.partition() + "-offset:" + record.offset();
    if (RedisUtils.isExistsKey(key)) {
        ack.acknowledge();
        return;
    }

    try {
        if (message.isPresent() && (record.timestamp() > (System.currentTimeMillis() - kafkaConsumerDelayTime))) {
            JSONObject msg = JSONObject.parseObject(record.value().toString());
            msg.put(VSMART_KAFKA_MSG_POSITION_INFO, key);

            //具体操作
        }
    }catch (Exception e){
        
    }finally {
        ack.acknowledge();
    }
}    

#redis部分 

public Boolean handler(JSONObject msg) {
    //解析
    Boolean isOk = jsonToDetectionInfos(msg);

    if (!isOk) {
        return false;
    }

    //加锁 associatedKey()
    
    String lockKey = associatedKey();
    if (StrUtil.isEmpty(lockKey)) {
        return false;
    }
    RLock lock = SpringUtils.getBean(RedissonClient.class).getLock(lockKey);
    //锁的时间 根据业务需要进行调整
    try {
        boolean flag_2 = lock.tryLock(10, 300, TimeUnit.SECONDS);

        if (flag_2) {        
            //加锁后执行前判断是否已经处理过kafka中相同位置的信息了
            if (ObjectUtil.isNotNull(msg) &&
                    ObjectUtil.isNotNull(msg.get(VSMART_KAFKA_MSG_POSITION_INFO)) &&
                    RedisUtils.isExistsKey(msg.getString(VSMART_KAFKA_MSG_POSITION_INFO))) {            
                return false;
            }

            //具体业务操作
            //...
                
            return true;
        } else {
            detectionRuleBo.getLogText().append(StrUtil.format("{}-获取锁失败;", detectionRuleBo.getName())).append("<br>");
            return false;
        }

    } catch (Exception e) {
        
    } finally {
        ///释放锁
        if (null != lock && lock.isHeldByCurrentThread()) {        
            if (ObjectUtil.isNotNull(msg) &&
                    ObjectUtil.isNotNull(msg.get(VSMART_KAFKA_MSG_POSITION_INFO))) {
                RedisUtils.setCacheStrExpire(msg.getString(VSMART_KAFKA_MSG_POSITION_INFO), msg.getString(VSMART_KAFKA_MSG_POSITION_INFO), 60 * 60);
            }
            //解锁
            lock.unlock();
        }
        return true;
    }
}

相关文章:

Kafka+redis分布式锁结合使用心得总结

#kafka部分 KafkaListener(topics "#{${vsmart_alert_detection_tms_send_message_topic}.split(,)}", groupId "${vsmart.alert.detection.consumer.group}") public void vsmartAlertDetectionTmsSendMessage(ConsumerRecord<?, ?> record, A…...

cmd打开idea

当我们用idea打开一个项目的时候&#xff0c;有时候这个项目目录是有的&#xff0c;但是用idea的open却找不到&#xff0c;有时候我要重新关闭窗口&#xff0c;再open好多次才有 于是我现在使用命令打开&#xff0c;先把idea安装路径的bin目录放在path里面 然后cd到项目路径&…...

javaScript爬虫程序抓取评论

由于评论区目前没有开放的API接口&#xff0c;所以我们不能直接通过编程获取到评论区的内容。但是&#xff0c;我们可以通过模拟浏览器的行为来实现这个功能。以下是一个使用Python的requests库和BeautifulSoup库来实现这个功能的基本思路&#xff1a; import requests from bs…...

RT-DETR 应用 CARAFE:特征内容感知重新组装

特征上采样是现代卷积神经网络架构中的关键操作,例如特征金字塔。其设计对于密集预测任务,如目标检测和语义/实例分割至关重要。在本研究中,我们提出了一种称为内容感知特征重组(CARAFE)的通用、轻量级且高效的操作符,以实现这一目标。CARAFE具有以下几个优点:(1)大的…...

Git Commit 之道:规范化 Commit Message 写作指南

1 commit message 规范 commit message格式都包括三部分&#xff1a;Header&#xff0c;Body和Footer <type>(<scope>): <subject><body><footer>Header是必需的&#xff0c;Body和Footer则可以省略 1.1 Header Type&#xff08;必需&#xf…...

【机试题】LazyIterator迭代器懒加载问题

将下面这个未完成的Java工具类补充完成&#xff0c;实现懒加载的功能&#xff0c;该类需要实现Iterable接口&#xff0c;能够遍历所有数据。具体要求如下&#xff1a; 工具类提供了一个ValueLoader接口&#xff0c;用于获取数据&#xff0c;其中ValueLoader的接口定义为&#x…...

【面试经典150 | 位运算】位1的个数

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;循环检查二进制位方法二&#xff1a;位运算优化方法三&#xff1a;__builtin_popcount() 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…...

vue中数据代理和事件处理

数据代理 直接在对象下可直接修改属性的值&#xff0c;而Object提供defineProperty()对属性进行控制 <script>let perosn {name: 小蜜,sex: 男,//age: 19 }Object.defineProperty(perosn,age,{value: 19//enumerable: true ,添加enumerable将默认值改为true&#xff0c…...

Unity之NetCode多人网络游戏联机对战教程(8)--玩家位置同步

文章目录 前言添加相机玩家添加对应组件服务端权威&#xff08;server authoritative&#xff09;客户端权威&#xff08;client authoritative&#xff09;服务端同步位置阅读与理解PlayerTransformSync.csNetworkVariableUploadTransformSyncTransform 后话 前言 承接上篇&a…...

spring boot 中@Value读取中文配置时乱码

1.spring boot 读取application.properties 该文件是iso8859编码 如果是直接写中文 读取时会乱码 显示成?? 必须得转ascii码才能正常显示 其他方法测试也不行 Value("${apig.order.tiaokong.qianzi}") private String apigOrderTiaokongQianzi;...

选择.NET 还是 Java?

1、.NET Framework的演变&#xff1a; .NET Framework&#xff1a; 最初由Microsoft引入&#xff0c;是一个Windows上的全功能框架。它包含了ASP.NET、Windows Presentation Foundation&#xff08;WPF&#xff09;、Windows Communication Foundation&#xff08;WCF&#xff…...

vue 高阶组件;高阶组件

vue 高阶组件;高阶组件 文章目录 vue 高阶组件;高阶组件1. 什么是高阶组件2. 高阶组件的作用3. 高阶组件的使用 例子1&#xff1a;创建一个简单的高阶组件例子2&#xff1a;使用element-ui的高阶组件 1. 什么是高阶组件 高阶组件是一个函数&#xff0c;传给它一个组件&#xf…...

数据结构:树的基本概念(二叉树,定义性质,存储结构)

目录 1.树1.基本概念1.空树2.非空树 2.基本术语1.结点之间的关系描述2.结点、树的属性描述3.有序树、无序树4.森林 3.树的常考性质 2.二叉树1.基本概念2.特殊二叉树1.满二叉树2.完全二叉树3.二叉排序树4.平衡二叉树 3.常考性质4.二叉树的存储结构1.顺序存储2.链式存储 1.树 1.…...

【Qt之QStandardItemModel类】介绍

描述 QStandardItemModel类提供了一个通用的模型&#xff0c;用于存储自定义数据。QStandardItemModel可以用作Qt标准数据类型的存储库。它是 Model/View类 之一&#xff0c;是 Qt的model/view框架 的一部分。 QStandardItemModel提 供了一种基于项目的传统方法来处理模型。 Q…...

01-Spring中的工厂模式

工厂模式 工厂模式的三种形态: 工厂模式是解决对象创建问题的属于创建型设计模式,Spring框架底层使用了大量的工厂模式 第一种&#xff1a;简单工厂模式是工厂方法模式的一种特殊实现,简单工厂模式又叫静态工厂方法模式不属于23种设计模式之一第二种&#xff1a;工厂方法模式…...

Linux是什么,Linux系统介绍

很多小伙伴都不是那么了解和知道Linux&#xff0c;到底Linux是什么&#xff1f; 像大家用到的安卓手机&#xff0c;生活中用到的各种智能设备&#xff0c;比如路由器&#xff0c;光猫&#xff0c;智能家具等&#xff0c;很多都是在Linux操作系统上。 Linux是什么&#xff1f;Li…...

爬虫项目(11):使用多线程对36手机高清壁纸批量抓取

文章目录 书籍推荐目标网址单线程实现多线程实现爬取结果书籍推荐 如果你对Python网络爬虫感兴趣,强烈推荐你阅读《Python网络爬虫入门到实战》。这本书详细介绍了Python网络爬虫的基础知识和高级技巧,是每位爬虫开发者的必读之作。详细介绍见👉: 《Python网络爬虫入门到…...

JavaScript_动态表格_删除功能

1、动态表格_删除功能 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>动态表格_添加和删除功能</title><style>table{border: 1px solid;margin: auto;width: 100%;}td,th{text-align: …...

一步一步开发微信小程序(Django+Mysql)

前提&#xff1a;假设你已经安装好Anaconda&#xff0c;微信开发者工具&#xff0c;MySQL数据库&#xff0c;IDE等工具 工具下载地址&#xff1a; Anaconda&#xff1a;https://www.anaconda.com/download MySQL&#xff1a;https://dev.mysql.com/downloads/mysql/ 微信开…...

mysql 讲解(1)

文章目录 前言一、基本的命令行操作二、操作数据库语句2.1、创建数据库2.2、删除数据库2.3、使用数据库2.4 查看所有数据库 三、列的数据类型3.1 字符串3.2 数值3.3 时间日期3.4 空3.5 int 和 varchar问题总结&#xff1a; 四、字段属性4.1 UnSigned4.2 ZEROFILL4.3 Auto_InCre…...

分布式与微服务技术架构

对比项分布式微服务微服务前端框架Vue 2Vue 3React18脚本语言JavaScriptTypeScriptJSX / ES6 / TypeScript构建工具Vue CLIViteViteUI 组件库Element UIElement PlusAnt Design状态管理VuexPiniaRedux Toolkit&#xff08;RTK&#xff09;路由管理Vue Router 3Vue Router 4Reac…...

Step3-VL-10B-Base助力互联网内容分析:海量图文信息的情感与主题挖掘

Step3-VL-10B-Base助力互联网内容分析&#xff1a;海量图文信息的情感与主题挖掘 每天&#xff0c;互联网上都会产生数以亿计的图文内容&#xff0c;从社交媒体上的随手一拍&#xff0c;到新闻网站的长篇报道。对于品牌方、内容平台或是研究者来说&#xff0c;如何从这片信息的…...

Go 语言构建 Agent 服务的优势

Go 语言构建 Agent 服务的核心优势与工程实践全解析作者&#xff1a; 架构师阿哲 发布时间&#xff1a; 202X-XX-XX 阅读时长&#xff1a; 约45分钟 字数统计&#xff1a; 12,870前置说明&#xff1a;系统需求与读者画像的校准 首先&#xff0c;我注意到当前的输入上下文存在一…...

Bypass Paywalls Chrome Clean:突破付费内容壁垒的高效浏览器扩展

Bypass Paywalls Chrome Clean&#xff1a;突破付费内容壁垒的高效浏览器扩展 在信息爆炸的数字时代&#xff0c;优质内容常被付费墙阻隔&#xff0c;学术文献、深度报道和专业期刊的访问限制成为知识获取的主要障碍。Bypass Paywalls Chrome Clean作为一款开源浏览器扩展&…...

SecGPT-14B私有化部署:企业内网安全使用OpenClaw的方案

SecGPT-14B私有化部署&#xff1a;企业内网安全使用OpenClaw的方案 1. 为什么需要内网专属AI助手 去年我在某金融机构参与了一个敏感项目&#xff0c;客户要求所有数据处理必须在隔离网络中完成。当我第一次尝试用公有云API调用AI能力时&#xff0c;安全团队立即叫停了整个流…...

AI 时代:祛魅、适应与重新定义畔

指令替换 项目需求&#xff1a;将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一&#xff0c;测试代码示例 test.c // test.c #includ…...

AI落地业务流程:别犯这两个错误!这才是人机协作的正确姿势

很多团队一提到 AI 进入业务流程&#xff0c;最容易滑向两个极端。一个极端是“既然 AI 很强&#xff0c;就让它全自动做完”&#xff1b;另一个极端是“既然不放心&#xff0c;那就什么都别让它碰”。真正能进生产环境的做法&#xff0c;通常都不在这两头。 Human-in-the-Loop…...

digitalPinFast:AVR平台GPIO寄存器级极速操作库

1. 项目概述 digitalPinFast 是一个面向嵌入式底层开发的轻量级 GPIO 操作加速库&#xff0c;其核心设计目标是 在不依赖编译器内置指令&#xff08;如 __builtin_avr_delay_cycles &#xff09;或硬件外设&#xff08;如定时器、CLI/SEI 中断控制&#xff09;的前提下&…...

从报告看懂安全隐患,提升防护能力

渗透测试报告不仅是“漏洞清单”&#xff0c;更是企业提升安全防护能力的“行动指南”。很多企业拿到报告后&#xff0c;只关注漏洞数量&#xff0c;却不知道如何解读隐患、落地整改&#xff0c;最终导致测试流于形式&#xff0c;安全风险依然存在。下面通俗拆解&#xff0c;教…...

毕业设计实战:基于SSM+Vue的家乡特产网上商城设计与实现指南

毕业设计实战&#xff1a;基于SSMVue的家乡特产网上商城设计与实现指南 在开发“基于SSMVue的家乡特产网上商城”毕业设计时&#xff0c;我曾因商品订单表未通过用户ID、商品ID与收货地址ID三外键关联踩过关键坑——初期设计订单表时&#xff0c;仅记录了订单号、购买数量、实…...