spring使用redis作为消息订阅

redis可以用于消息订阅,下面一段代码实现了spring中使用redis作为消息订阅模型:
消息处理器:

/*** 接口RedisMessageHandler:*/
public interface RedisMessageHandler {/*** 处理redis消息* @param message redis消息* @return 处理结果*/String handlerRedisMessage(TMRedisMessage message);}

实现消息处理:


@Service
@Slf4j
public class ClusterMessageHandler implements RedisMessageHandler {@Overridepublic String handlerRedisMessage(TMRedisMessage tmRedisMessage) {log.info("收到消息通知,消息内容:{}", tmRedisMessage);// 设置JWT信息JwtUtil.setJwtInfo(String.valueOf(tmRedisMessage.getAppId()), tmRedisMessage.getUin());// 构造集群组件创建/卸载请求var clusterRequest = new ClusterRequest();clusterRequest.setClusterId(tmRedisMessage.getClusterId());ClusterFactory.get(ClusterTypeEnum.COMMON.getName()).create(clusterRequest);JwtUtil.removeJwtInfo();return "success";}
}

消息消费者:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.tencent.tbds.tm.platform.server.message.RedisMessageHandler;
import com.tencent.tbds.tm.platform.server.message.pojo.TMRedisMessage;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.TimeUnit;/*** 类RedisConsumer:*/@Component
@Slf4j
public class RedisConsumer implements MessageListener {@Resourceprivate RedisTemplate<String, Object> redisTemplate;private final Map<String, RedisMessageHandler> redisMessageHandlerMap;public RedisConsumer(ConfigurableApplicationContext context) {this.redisMessageHandlerMap = context.getBeansOfType(RedisMessageHandler.class);}@Overridepublic void onMessage(Message message, byte[] bytes) {try {var channel = new String(message.getChannel());var body = new String(message.getBody());log.info("Received Redis message: {} from channel: {}", body, channel);var tmRedisMessage = new ObjectMapper().readValue(body, TMRedisMessage.class);var isSet = redisTemplate.opsForValue().setIfAbsent(tmRedisMessage.getClusterType() + tmRedisMessage.getEventsType(), "1", 5, TimeUnit.SECONDS);if (isSet != null && isSet) {for (var redisMessageHandler : redisMessageHandlerMap.values()) {messageErrorHandler(redisMessageHandler, tmRedisMessage);}}} catch (Exception e) {log.error("Received Redis Message From Tm Error! ", e);}}/*** 消息处理错误处理* @param redisMessageHandler 请求处理类* @param tmRedisMessage 消息体*/private void messageErrorHandler(RedisMessageHandler redisMessageHandler, TMRedisMessage tmRedisMessage) {var errMessage = "";try {var handlerClass = redisMessageHandler.getClass();var annotation = handlerClass.getAnnotation(MessageHandler.class);var clusterType = annotation.ClusterType();var eventsType = annotation.EventsType();if (clusterType.length == 0 && eventsType.length == 0) {log.info("{} Handler all Redis Message", handlerClass.getName());errMessage = redisMessageHandler.handlerRedisMessage(tmRedisMessage);} else {var clusterTypeList = Arrays.stream(clusterType).boxed().toList();var eventsTypes = Arrays.asList(eventsType);if (clusterTypeList.contains(tmRedisMessage.getClusterType()) &&eventsTypes.contains(tmRedisMessage.getEventsType())) {log.info("Invoke RedisMessageHandler to handler Message: {}", handlerClass.getName());errMessage = redisMessageHandler.handlerRedisMessage(tmRedisMessage);}}} catch (Exception e) {errMessage = e.getMessage();}log.info("Redis message handler  result is {}", errMessage);}
}

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

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

相关文章

Electron录制-webm转mp4时长拉长问题

问题1 在导出视频时&#xff0c;发现最终导出视频的时长与实际录制的视频时长不一样&#xff0c;而且视频中某一帧会延迟。 猜想0 在项目中使用mp4-wasm导出mp4视频&#xff0c;同时利用canvas做一些效果&#xff0c;猜想是在canvas处理时有延迟。但是当把canvas处理效果全部…

分页查询前端对接

文章目录 添加角色修改角色当点击修改按钮后,那么就会弹出对话框,所以要设置显示为true点击修改的时候就是 要显示对话框 制作用户管理页面开发后端接口用户查询前端整合新增接口功能实现修改 添加角色 首先添加 添加表单的组件 那么总结一下 就是使用 组件 然后再使用变量接…

面试题2:从浏览器输入一个URL,到最终展示前端页面这一过程,会发生什么?

这是一个高频的面试题目。 题目答案是开放性的&#xff0c;一般以后端开发的角度回答。 当地址栏输入一个 URL 后&#xff1a; 一、首先会进行 DNS 域名解析 DNS 域名解析&#xff1a;网络上的设备都是通过 IP 地址&#xff0c;作为身份标识的。但是由于点分十进制的 IP 地址 …

Python基础入门

目录 1. 什么是Python&#xff1f; 2. 安装Python 3. Python基础语法 4. 数据结构 5. 文件操作 6. Python标准库 总结 1. 什么是Python&#xff1f; Python是一种高级编程语言&#xff0c;由Guido van Rossum于1991年发布。它以其简单易读的语法和强大的功能而闻名&…

Nominatim免费的地址解析,逆地址解析,OpenStreetMap开源地图数据【全网最全】

视频学习地址 国内的一些地址解析供应商的API都开始付费了&#xff0c;就想找个免费的地址解析和逆地址解析的应用&#xff0c;最终选择了Nominatim OpenStreetMap 文章目录 一、选型1-1、数据源1-2、地理编码引擎2-1、初尝Nominatim2-1-1、地址解析2-1-2、逆地址解析 2-2、OS…

国内外大模型生态发展报告!

很多同学只知类似Check GPT或者说对国内的一些比较了解&#xff0c;对国外的不太了解&#xff0c;所以在这总结。 1 大模型的发展 左表 名称参数特点发布时间GPT-215亿英文底模&#xff0c;开源2019年Google T5110亿多任务微调, 开源2019年GPT-3.51750亿人工反馈微调2022年M…

UFS Power Mode Change 介绍

一. UFS Power Mode Change简介 1.UFS Power Mode指的是Unipro层的Power State, 也可以称为链路(Link)上的Power Mode, 可以通过配置Unipro Attribute, 然后控制切换Unipro Power State, 当前Power Mode Change有两种触发方式&#xff1a; (1) 通过DME Power Mode Change触发…

手工清理Linux后门:深入分析与实践指南

手工清理Linux后门&#xff1a;深入分析与实践指南 后门概述 后门程序允许未授权用户绕过正常的认证过程&#xff0c;获取对系统的访问权限。攻击者可能会通过修改计划任务、开机启动脚本&#xff0c;甚至植入Rootkit来维持后门。 分析操作系统被动手脚 在清理后门之前&…

创建一个基本的网页爬虫

创建一个基本的网页爬虫通常涉及使用Python库如requests来获取网页内容&#xff0c;以及BeautifulSoup来解析HTML并提取所需的信息。下面是一个简单的Python爬虫示例&#xff0c;该爬虫从网站上抓取新闻标题。为了演示&#xff0c;我将使用一个假设的新闻网站&#xff0c;但你可…

Jvm针对分代垃圾回收算法配置调优

堆大小设置 年轻代的设置很关键 JVM中最大堆大小有三方面限制&#xff1a;相关操作系统的数据模型&#xff08;32-bt还是64-bit&#xff09;限制&#xff1b;系统的可用虚拟内存限制&#xff1b;系统的可用物理内存限制。32位系统下&#xff0c;一般限制在1.5G~2G&#xff1b…

java中实现Callable方式创建线程

一、为啥要引入Callable 在前面讲了通过继承Thread和实现Runnable方式创建线程的区别&#xff0c;那为什么有了Runnable还要引入Callable?下面通过实现Runnable方式的弊端给出答案 实现Runnable方式的弊端&#xff1a; package java.lang; FunctionalInterface public inte…

宁波银行票据案例解读,要注入科技赋能票据新形式

随着科技的飞速发展&#xff0c;金融行业正迎来一场前所未有的变革。作为一家以科技创新为驱动的现代化银行&#xff0c;宁波银行在这场变革中积极探索&#xff0c;宁波银行票据案例之后持续通过引入先进技术&#xff0c;为客户提供更加高效、智能的金融服务。 宁波银行推出的…

1095 解码PAT准考证(测试点3)

solution 测试点3超时&#xff1a;命令为3时&#xff0c;用unordered_map而非map&#xff0c;否则会超时 #include<iostream> #include<string> #include<algorithm> #include<unordered_map> using namespace std; const int maxn 1e4 10; struct…

2024山东大学软件学院创新项目实训(9)使用OpenCompass进行模型评估

下载好OpenCompassData-core-20231110.zip 之后&#xff0c;解压压缩包 unzip OpenCompassData-core-20231110.zip 运行代码&#xff1a; python run.py --datasets ceval_gen --hf-path /hy-tmp/7B21/merged --tokenizer-path /hy-tmp/7B21/merged --tokenizer-kwargs p…

步步精:连接器领域的卓越品牌

自1987年成立以来&#xff0c;步步精坐落于美丽的旅游城市——温州市乐清虹桥镇&#xff0c;被誉为“国家电子主体生产基地”、“国家精密模具制造基地”。公司拥有7大厂区、9大事业部&#xff0c;800名专职员工&#xff0c;致力于提供高品质的连接器解决方案。注册商标“BBJCO…

家庭成员目标管理系统设计

一、项目背景与目标 随着现代社会对家庭教育的重视&#xff0c;家庭成员之间的目标设定与达成成为家庭和谐与进步的关键。本项目旨在设计一个家庭成员目标管理系统&#xff0c;通过系统化的方式帮助家庭成员设定、追踪和达成个人及家庭目标&#xff0c;从而提升家庭成员的成就感…

百度ai人脸识别项目C#

一、项目描述 本项目通过集成百度AI人脸识别API&#xff0c;实现了人脸检测和识别功能。用户可以上传图片&#xff0c;系统将自动识别人脸并返回识别结果。 二、开发环境 Visual Studio 2019或更高版本.NET Framework 4.7.2或更高版本AForge.NET库百度AI平台人脸识别API 三、…

从网络配置文件中提取PEAP凭据

我的一位同事最近遇到了这样一种情况&#xff1a;他可以物理访问使用802.1X连接到有线网络的Windows计算机&#xff0c;同时保存了用于身份验证的用户凭据&#xff0c;随后他想提取这些凭据&#xff0c;您可能认为这没什么特别的&#xff0c;但是事情却有点崎岖波折…… 如何开…

Android C++系列:C++最佳实践2抽象类

1. 背景 OOP面向对象程序设计的核心是数据抽象&#xff0c;继承和动态绑定。前面的文章我们介绍了使用virtual的虚类实现动态绑定的多态&#xff0c;有时候我们在做抽象时&#xff0c;对于抽象的实体不想让被人实例化&#xff0c;虚类没有这个功能&#xff0c;我们Java里面我们…

攻防世界-5-1

下载文件发现是一个没有尾缀的文件&#xff0c;扔winhex&#xff0c;emmmm还是没看出来 搜了一圈&#xff0c;发现用xortool 得到key之后&#xff0c;跑一下脚本 得到flag&#xff1a; wdflag{You Are Very Smart}