仿牛客网项目---消息队列的实现

本篇文章讲一讲我们的项目中用到的消息队列。

 

1.阻塞队列

2.kafka

我的项目为什么要用消息队列?

如果采用消息队列,那么评论、点赞、关注三类不同的事,可以定义三类不同的主题(评论、点赞、关注),发生相应的事件可以将其包装成一条消息放入对应的队列里。那么当前的线程可以继续处理下一条消息,不用处理后续的业务(后续由消费者线程处理)。面向事件驱动编程。

3.发布系统通知

下面讲讲怎么发布系统通知。

在entity包下创建event类:

public class Event {private String topic;  //表示事件的主题的字符串private int userId;     //表示与事件相关的用户的IDprivate int entityType;   //表示与事件相关的实体类型private int entityId;      //表示与事件相关的实体的IDprivate int entityUserId;    //表示与实体相关的用户的IDprivate Map<String, Object> data = new HashMap<>();   //一个Map对象,用于存储与事件相关的附加数据//省略了很多get()方法和set()方法
}

通过使用这个Event类,我就可以创建一个事件对象,并设置事件的主题、用户ID、实体类型、实体ID、实体用户ID以及其他相关的附加数据。

接着在在community的event目录下创建EventProducer、EventCnsumer类。

@Component
public class EventProducer {@Autowiredprivate KafkaTemplate kafkaTemplate;// 处理事件public void fireEvent(Event event) {// 将事件发布到指定的主题kafkaTemplate.send(event.getTopic(), JSONObject.toJSONString(event));}}

通过调用fireEvent方法,我们就可以将一个事件对象发送到Kafka消息队列中的指定主题。这样,消费者可以从该主题订阅事件,并对事件进行相应的处理逻辑。

@Component
public class EventConsumer implements CommunityConstant {private static final Logger logger = LoggerFactory.getLogger(EventConsumer.class);@Autowiredprivate MessageService messageService;@KafkaListener(topics = {TOPIC_COMMENT, TOPIC_LIKE, TOPIC_FOLLOW})public void handleCommentMessage(ConsumerRecord record) {if (record == null || record.value() == null) {logger.error("消息的内容为空!");return;}Event event = JSONObject.parseObject(record.value().toString(), Event.class);if (event == null) {logger.error("消息格式错误!");return;}// 发送站内通知Message message = new Message();message.setFromId(SYSTEM_USER_ID);message.setToId(event.getEntityUserId());message.setConversationId(event.getTopic());message.setCreateTime(new Date());Map<String, Object> content = new HashMap<>();content.put("userId", event.getUserId());content.put("entityType", event.getEntityType());content.put("entityId", event.getEntityId());if (!event.getData().isEmpty()) {for (Map.Entry<String, Object> entry : event.getData().entrySet()) {content.put(entry.getKey(), entry.getValue());}}message.setContent(JSONObject.toJSONString(content));messageService.addMessage(message);}
}

handleCommentMessage方法中,首先检查接收到的消息是否为空,然后将消息内容解析为Event对象。如果解析失败,会记录错误并返回。

接下来,根据接收到的事件信息,构建一个站内通知的Message对象。设置发送者ID为系统用户ID,接收者ID为事件关联的实体用户ID,会话ID为事件主题,创建时间为当前时间。

然后,构建一个存储事件相关信息的content映射。

最后,将content转换为JSON字符串,并将其设置为站内通知的内容。

说了一堆乱七八糟的,反正就是这段代码提供了一个事件消费者类,用于订阅和处理从Kafka消息队列中接收到的指定事件主题的消息。它可以根据事件的类型执行相应的处理操作,例如发送站内通知等。

在评论、点赞、关注视图层增加方法。

CommentController。LikeController。Followcontroller。

4.显示系统通知

消息未读使用拦截器实现,因为每个请求都需要记录次数。

@Component
public class MessageInterceptor implements HandlerInterceptor {@Autowiredprivate HostHolder hostHolder;@Autowiredprivate MessageService messageService;@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {User user = hostHolder.getUser();if (user != null && modelAndView != null) {int letterUnreadCount = messageService.findLetterUnreadCount(user.getId(), null);int noticeUnreadCount = messageService.findNoticeUnreadCount(user.getId(), null);modelAndView.addObject("allUnreadCount", letterUnreadCount + noticeUnreadCount);}}
}

上面的这段代码提供了一个消息拦截器类,用于在请求处理完成后,对返回的ModelAndView对象进行拦截和处理,以实现消息的统计和展示功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/727909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于C/C++ riscv64、mipsel 平台标准库 std::atomic<T> 原子变量编译失败问题解决

RISCV64 适用 C/C STL 平台原子变量链接不上的问题&#xff0c;可以看下之前写的这篇文章。 RISC-V平台 std::atomic&#xff1c;T&#xff1e; 编译失败问题解决-CSDN博客 mipsel 平台上面也可以按照这个方式解决&#xff0c;在 mipsel 平台上面没法使用 8字节的STL原子变量&…

游戏盾如何应对微商城网站DDoS攻击

游戏盾如何应对微商城网站DDoS攻击&#xff1f;随着电子商务的快速发展&#xff0c;微商城网站已成为众多商家开展在线业务的重要平台。然而&#xff0c;与此同时&#xff0c;网络安全威胁也愈发严重。其中&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击是一种常…

AI Agents之CrewAI智能体开发框架

一、前言 AI Agents 的开发是当前软件创新领域的热点。随着大语言模型 (LLM) 的不断进步&#xff0c;预计 AI 智能体与现有软件系统的融合将出现爆发式增长。借助 AI 智能体&#xff0c;我们可以通过一些简单的语音或手势命令&#xff0c;就能完成以往需要手动操作应用程序才能…

性能测试之性能调优

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 性能测试是通过模拟实际使用场景&#xff0c;对系统进行压力测试…

leetocode1047.删除字符串中的所有相邻重复项

思想&#xff1a;使用栈来存储最近访问过的元素。string尾部就是栈顶&#xff0c;可访问最近访问过的字符&#xff0c;后入先出。具体思想直接参考 【栈的好戏还要继续&#xff01;| LeetCode&#xff1a;1047. 删除字符串中的所有相邻重复项】 string方法API&#xff0c;记住…

学习Android的第二十五天

目录 Android TextWatcher 范例 参考文档 Android 消息传递 - Handler Handler的工作机制 Handler 方法 范例 参考文档 Android AsyncTask 异步任务 什么是多线程 同步与异步 Android 为什么要引入异步任务 AsyncTask AsyncTask 方法与流程 范例 参考文档 Andr…

【华为OD机试】最多购买宝石数目【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述: 橱窗里有一排宝石,不同的宝石对应不同的价格, 宝石的价格标记为gems[i],0<=i<n, n = gems.length 宝石可同时出售0个或多个,如果同时出售多个,则要求出售的宝石编号连续; 例如…

片上网络(NoC)技术的发展及其给高端FPGA带来的优势

片上网络(NoC)技术的发展及其给高端FPGA带来的优势 1. 概述 在摩尔定律的推动下,集成电路工艺取得了高速发展,单位面积上的晶体管数量不断增加。 片上系统(System-on-Chip,SoC)具有集成度高、功耗低、成本低等优势,已经成为大规模集成电路系统设计的主流方向,解决了…

java017 - Java抽象类

1、概述 一般情况&#xff0c;动物是抽象的&#xff0c;所以不能被new,比如你在Animal类中定义一个成员方法eat,你不能定义具体内容&#xff0c;比如吃鱼或者吃白菜&#xff0c;因为动物是抽象的。 一个没有方法体的方法&#xff0c;应该定义为抽象方法&#xff0c;而类中如果…

I’m stuck!(CCF201312-5)解析(java实现)

代码 package test_201312;import java.util.Scanner;/** 201312-5 试题名称&#xff1a; I’m stuck! 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述给定一个R行C列的地图&#xff0c;地图的每一个方格可能是#, , -, |, ., S, T七…

Oracle控制文件control file(1)控制文件概述

导读 本文介绍Oracle数据库控制文件control file相关内容 1、控制文件概述 控制文件是数据库中非常重要的一类文件&#xff0c;它记录的当前实例连接的数据库的结构和行为&#xff0c;并维护数据库的一致性。 初始化参数文件中定义了控制文件的位置&#xff1b; 控制文件是很…

抖音短视频小程序发布招聘让招聘更简单!

抖音短视频小程序怎么发布招聘信息呢&#xff1f; 据2023年初统计&#xff0c;全国已有人力资源机构6.3万家&#xff0c;其中在抖音短视频平台发布的人力资源公司有1.9万家以上&#xff0c;全国有近几千家大型企业已经通过抖音平台进行岗位直招。 抖音目前已经成为短视频流量…

2024年最佳硬盘!为台式电脑、NAS等产品量身定做的顶级机械硬盘

机械硬盘&#xff08;HDD&#xff09;可能看起来像是古老的技术&#xff0c;但它们仍然在许多地方提供“足够好”的性能&#xff0c;并且它们很容易以同等的价格提供最多的存储空间。 尽管最好的SSD将为你的操作系统和引导驱动器提供最好的体验&#xff0c;并提供比HDD更好的应…

vite项目修改依赖不更新,清除依赖缓存

有些时候我们会直接修改依赖文件&#xff0c;但修改后没有更新&#xff0c;大多数情况下就是被缓存了 解决方法 1、手动删除node_modules/.vite Vite 会将预构建的依赖缓存到 node_modules/.vite;然后手动删除即可 2、强制vite重新构建依赖 用 --force 命令行选项启动开发服务…

JavaScript this对象

this关键字时是函数运行时自动生成的一个内部对象&#xff0c;只能在函数内部使用&#xff0c;总指向调用它的对象 绑定规则 默认绑定 全局环境中定义函数&#xff0c;内部使用this关键字 var name Jenny; function person() {return this.name; } console.log(person());…

C++项目--高并发内存池

目录 一、项目介绍二、内存池介绍2.1 池化技术2.2 内存池2.3 内存池主要解决的问题2.4 malloc 三、定长内存池的实现3.1 定长内存池概念3.2 内存池管理释放对象3.3 内存池申请对象3.4 定长内存池整体代码3.5 性能对比 四、高并发内存池整体框架设计4.1 该项目解决的问题4.2 整体…

C语言贪吃蛇实现,以及一些有趣的想法(可加速减速)

文章目录 每日一言代码&#xff1a;Snake.hSnake.ctest.c 可以增加游戏趣味性的想法结语 每日一言 结局每隔一段时间就会到来&#xff0c;我经历它&#xff0c;就像飞机穿过云层。 跟着课程敲了一下午&#xff0c;终于写好了~ 用到了一些没用过的函数&#xff0c;总结介绍一下…

【Linux的网络编程】

1、OSI的七层网络模型有哪些&#xff0c;每一层有什么作用&#xff1f; 答&#xff1a;&#xff08;1&#xff09;应用层&#xff1a;负责处理不同应用程序之间的通信&#xff0c;需要满足提供的协议&#xff0c;确保数据发送方和接收方的正确。 &#xff08;2&#xff09;表…

【力扣100】70.爬楼梯 || python中的@cache || 装饰器

添加链接描述 思路&#xff1a; 最后一节楼梯的方式来自倒数第二节和倒数第三节的方法所以使用递归来做&#xff0c;定义递归出口n分别为1,2时候的方法种数&#xff1a;1种和2种类似于斐波那契数列超时了 优化&#xff1a; 5. 因为每次递归都要从n算到n为1和2的时候&#xff0…

安卓Java面试题 1-10

&#x1f525; 1、简述Android的4大组件是哪些&#xff0c;它们的作用&#xff1f;&#x1f525; Android的4大组件 1&#xff1a;Activity&#xff1a;Activity是Android程序与用户交互的窗口&#xff0c;是Android构造块中最基本的一种&#xff0c;它需要为保持各界面的状态…