项目启动时自动订阅配置中指定的MQ主题,并将接收到的消息存储在Redis中,提供了一个HTTP接口来查询存储的消息

涵盖从application.yml配置,通过MQ订阅消息,将消息存放到Redis,最后通过HTTP接口提供消息查询的整个流程,我们将分步进行。

Step 1: application.yml配置

spring:profiles:active: devredis:host: localhostport: 6379database: 0jedis:pool:max-active: 10max-idle: 5min-idle: 0max-wait: -1msmq:subscribe:enable: truetopics:- topic1- topic2tag: "*"consumerGroup: "yourConsumerGroup"

这个配置文件定义了Redis的连接信息和MQ订阅的相关配置,包括是否启动时自动订阅MQ和订阅的主题列表。

Step 2: 消息存储服务(MessageStorage)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.util.Map;@Service
public class MessageStorage {private final StringRedisTemplate redisTemplate;@Autowiredpublic MessageStorage(StringRedisTemplate redisTemplate) {this.redisTemplate = redisTemplate;}public void storeMessage(String topic, String messageId, String message) {redisTemplate.opsForHash().put("mq:topic:" + topic, messageId, message);}public String getMessageByTopicAndId(String topic, String messageId) {Object message = redisTemplate.opsForHash().get("mq:topic:" + topic, messageId);return message != null ? message.toString() : null;}public Map<Object, Object> getAllMessagesByTopic(String topic) {return redisTemplate.opsForHash().entries("mq:topic:" + topic);}
}

Step 3: ConsumerManager

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Service;@Service
public class ConsumerManager implements CommandLineRunner {@Value("${mq.subscribe.enable:false}")private boolean autoSubscribe;@Value("${mq.subscribe.topics}")private List<String> topics;@Value("${mq.subscribe.tag}")private String tag;@Value("${mq.subscribe.consumerGroup}")private String consumerGroup;@Autowiredprivate MessageStorage messageStorage;// 示例方法,需根据实际MQ客户端进行实现public void startConsumer(String topic, String tag, String consumerGroup) {// 假设的MQ订阅逻辑// 省略实际的MQ订阅代码// 假设收到消息后:String messageId = "uniqueMessageId"; // 假设的消息IDString message = "Example Message"; // 假设的消息内容messageStorage.storeMessage(topic, messageId, message);}@Overridepublic void run(String... args) {if (autoSubscribe) {topics.forEach(topic -> {try {startConsumer(topic, tag, consumerGroup);} catch (Exception e) {e.printStackTrace();}});}}
}

Step 4: ConsumerController(HTTP接口)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Map;@RestController
@RequestMapping("/api/messages")
public class ConsumerController {@Autowiredprivate MessageStorage messageStorage;@GetMapping("/get")public ResponseEntity<?> getMessage(@RequestParam String topic, @RequestParam(required = false) String messageId) {if (messageId != null) {String message = messageStorage.getMessageByTopicAndId(topic, messageId);return message != null ? ResponseEntity.ok(message) : ResponseEntity.notFound().build();} else {Map<Object, Object> messages = messageStorage.getAllMessagesByTopic(topic);return ResponseEntity.ok(messages);}}
}

说明

  • MQ订阅逻辑ConsumerManager中的startConsumer方法需要根据你使用的MQ客户端库具体实现,这里仅提供了一个概念性的示例。
  • 消息存储与检索MessageStorage类使用Redis的Hash数据结构

来存储和检索消息。每个topic对应一个Hash,其中每个messageId是键,消息内容是值。

  • HTTP接口ConsumerController提供了一个/api/messages/get接口,允许根据topic和可选的messageId查询消息。

通过上述步骤,我们完成了一个简单的系统,它能够在项目启动时自动订阅配置中指定的MQ主题,并将接收到的消息存储在Redis中。同时,我们也提供了一个HTTP接口来查询存储的消息。这个示例提供了一个基本框架,你可以根据实际的需求和MQ客户端库进行调整和扩展。

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

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

相关文章

Spring用到了哪些设计模式?

目录 Spring 框架中⽤到了哪些设计模式&#xff1f;工厂模式单例模式1.饿汉式&#xff0c;线程安全2.懒汉式&#xff0c;线程不安全3.懒汉式&#xff0c;线程安全4.双重检查锁&#xff08;DCL&#xff0c; 即 double-checked locking&#xff09;5.静态内部类6.枚举单例 代理模…

【论文阅读】UniLog: Automatic Logging via LLM and In-Context Learning

注 由于其公司的保密政策&#xff0c;本文没有公开源代码&#xff0c;数据是公开的。 文章目录 摘要一、介绍二、背景和动机2.1、日志语句生成2.2、大语言模型2.3、上下文学习&#xff08;In-Context Learning&#xff0c;ICL) 三、UNILOG3.1、模型骨干3.2、提示策略3.2.1、提…

3d金属模型灯怎么安装---模大狮模型网

在3D场景中&#xff0c;添加灯光是非常重要的步骤&#xff0c;可以提升场景的氛围和逼真度。特别是对于金属材质的模型&#xff0c;合适的灯光设置能够突出其质感和反射效果。下面将介绍如何在3D软件中安装金属模型灯&#xff0c;并分为以下四个分类进行详细说明。 一、选择合适…

简述机器视觉技术在自动化行业中的典型应用

如今&#xff0c;自动化技术在我国发展迅猛&#xff0c;人们对于机器视觉的认识更加深刻&#xff0c;对于它的看法也发生了很大的转变。机器视觉系统提高了生产的自动化程度&#xff0c;让不适合人工作业的危险工作环境变成了可能&#xff0c;让大批量、持续生产变成了现实&…

竞赛 python+opencv+深度学习实现二维码识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; pythonopencv深度学习实现二维码识别 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 该项目较为新颖&…

【InternLM 实战营第二期笔记】书生·浦语大模型全链路开源体系及InternLM2技术报告笔记

大模型 大模型成为发展通用人工智能的重要途径 专用模型&#xff1a;针对特定任务&#xff0c;一个模型解决一个问题 通用大模型&#xff1a;一个模型应对多种任务、多种模态 书生浦语大模型开源历程 2023.6.7&#xff1a;InternLM千亿参数语言大模型发布 2023.7.6&#…

视觉信息处理与FPGA实现第八次作业——verilog实现对比度调节

一、查看灰度图的数据格式 2.1 安装HxD HxD下载链接&#xff1a;https://download.csdn.net/download/weixin_44357071/89045331 解压直接打开exe就能使用。 将需要查看二进制数据的图片拖到软件框里就能读取 2.2 找到bmp图像的图片点阵数据起始地址&#xff0c;原理和例子…

R语言批量计算t检验,输出pvalue和均值

1.输入数据如下&#xff1a; 2.代码如下 setwd("E:/R/Rscripts/rG4相关绘图") # 读取CSV文件 data <- read.csv("box-cds-ABD-不同类型rg4-2.csv", stringsAsFactors FALSE)# 筛选出Type2列为指定五种类型的数据 filtered_data <- subset(data, …

git常用操作指令

以下是Git的常用指令: 1. git init 说明&#xff1a;初始化一个新的Git仓库。 例子&#xff1a; $ mkdir my_project $ cd my_project $ git init Initialized empty Git repository in /path/to/my_project/.git/备注&#xff1a;在my_project目录下创建了一个新的Git仓库…

【AIGC调研系列】通义千问、文心一言、抖音云雀、智谱清言、讯飞星火的特点分析

通义千问、文心一言、抖音云雀、智谱清言、讯飞星火这五款AI大模型各有特色&#xff0c;它们在市场上的定位和竞争策略也有所不同。 通义千问&#xff1a;由阿里巴巴推出&#xff0c;被认为是最接近ChatGPT水平的国产AI模型[7]。它不仅提供了长文档处理功能&#xff0c;还能够…

使用Kaggle API快速下载Kaggle数据集

前言 在使用Kaggle网站下载数据集时&#xff0c;直接在网页上点击下载可能会很慢&#xff0c;甚至会出现下载失败的情况。本文将介绍如何使用Kaggle API快速下载数据集。 具体步骤 安装Kaggle API包 在终端中输入以下命令来安装Kaggle API相关的包&#xff1a; pip install…

flutter 打包成web应用后怎么通过url跳转页面

在 Flutter 中&#xff0c;如果你想要在打包成 Web 应用后通过 URL 跳转页面&#xff0c;你可以利用 Flutter 提供的路由导航系统和 URL 策略。以下是具体步骤&#xff1a; 1. 配置路由 在 Flutter 应用中定义路由&#xff0c;一种简单的方式是使用 MaterialApp 构造器的 rou…

elementplus-vue-审核按钮-对话框(Dialog )

效果图&#xff1a; 代码&#xff1a; <template> <el-button type"success" click"dialogVisible true" :icon"Edit">审核</el-button> <el-dialog v-model"dialogVisible" title"是否通过" width&q…

公链角逐中突围,Solana 何以成为 Web3 世界的流量焦点?

在众多区块链公链中&#xff0c;Solana 凭借其创纪录的处理速度和极低的交易费用&#xff0c;成为了众多开发者和投资者的宠儿。就像网络上流行的那句话所说&#xff1a;“Why slow, when you can Solana?”&#xff0c;Solana 正以它的速度和强大的生态系统&#xff0c;重新定…

uniApp使用XR-Frame创建3D场景(5)材质贴图的运用

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这篇我们讲解在xr-frame中如何给几何体赋予贴图材质。 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"><xr-node><xr-assets><xr-asse…

AcWing 800. 数组元素的目标和(哈希)

原题链接 哈希思路: 我们可以在输入 时把每个数存进哈希表里&#xff0c;对于每个输入的 b[i]看看 x−b[i]是否出现与哈希表即可。 图解 #include <iostream> #include <algorithm> #include <unordered_map> using namespace std;const int N 111111;in…

【网安小白成长之路】3.MySQL环境配置以及常用命令(增删改查)

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…

RabbitMQ3.x之四_RabbitMQ角色说明及创建用户与授权

RabbitMQ3.x之四_角色说明及创建用户与授权 文章目录 RabbitMQ3.x之四_角色说明及创建用户与授权1. 访问和授权1. Tags说明2. 命令行示例 2. 管理界面新建用户及访问授权1. 管理界面新建用户2. 管理界面中的授权说明3. guest用户不能远程登录提示 3. 创建用户1. 基本命令2. 实际…

大型矿业集团安全知识竞赛主持词

男&#xff1a;尊敬的各位领导&#xff0c;员工同志们&#xff1a; 合&#xff1a;大家好&#xff01; 男&#xff1b;首先让我们以热烈的掌声对公司领导亲临比赛现场指导观看表示欢迎&#xff01; 男&#xff1b;继成功开展了荣辱观专题讲座、好矿嫂女红艺术展、安全谜语竞猜…

RabbitMQ 实验消费原始队列消息, 拒绝(reject)投递死信交换机过程

如果你想通过 RabbitMQ 的死信队列功能实现消费者拒绝消息投递到死信交换机的行为&#xff0c;你可以按照以下步骤操作&#xff1a; 创建原始队列&#xff0c;并将其绑定到一个交换机上&#xff1a; export RABBITMQ_SERVER127.0.0.1 export RABBITMQ_PORT5672 export RAB…