利用RabbitMQ实现消息投递削峰填谷

article/2025/9/15 20:02:17

目录

异步和同步如何选择

异步线程 同步收发消息

一、导入依赖库

二、创建RabbitMQ配置类

三、创建消息任务类


异步和同步如何选择

·依靠多线程,Java代码可以同步执行也可以异步执行

·RabbitMQ提供了同步和异步两种收发消息模式

·我们采用 Java异步线程 MQ同步收发消息

异步线程 同步收发消息

一、导入依赖库

在 pom.xml 文件中添加RabbitMQ的依赖库 

<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.9.0</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

二、创建RabbitMQ配置类

        连接 RabbitMQ 需要用到 ConnectionFactory ,所以我们要自己创建好 ConnectionFactory 对象然后注册给Spring框架,这就需要我们创建 RabbitMQConfig 类。 

@Configuration
public class RabbitMQConfig {@Beanpublic ConnectionFactory getFactory(){ConnectionFactory factory=new ConnectionFactory();factory.setHost("localhost");factory.setPort(5672);return factory;}
}

三、创建消息任务类

        以前我们使用异步多线程的方式发送邮件,那么这次我们要创建的多线程任务类是用来收发RabbitMQ消息的,而且内部包含了同步执行和异步执行两种方式。

 

@Component
@Slf4j
public class MessageTask {@Autowiredprivate ConnectionFactory factory;@Autowiredprivate MessageService messageService;/*** 同步发送消息** @param topic 主题* @param entity 消息对象*/public void send(String topic, MessageEntity entity) {// 向MongoDB保存消息数据,返回消息IDString id = messageService.insertMessage(entity);// 向RabbitMQ发送消息try (Connection connection = factory.newConnection();Channel channel = connection.createChannel();) {// 连接到某个Topicchannel.queueDeclare(topic, true, false, false, null);// 存放属性数据HashMap map = new HashMap();map.put("messageId", id);// 创建AMQP协议参数对象,添加附加属性AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().headers(map).build();channel.basicPublish("", topic, properties, entity.getMsg().getBytes());log.debug("消息发送成功");} catch (Exception e) {log.error("执行异常", e);throw new EmosException("向MQ发送消息失败");}}@Asyncpublic void sendAsync(String topic, MessageEntity entity) {send(topic, entity);}/*** 同步接收数据** @param topic 主题* @return 接收消息数量*/public int receive(String topic) {int i = 0;// 接收消息数据try (Connection connection = factory.newConnection();Channel channel = connection.createChannel();) {// 从队列中获取消息,不自动确认channel.queueDeclare(topic, true, false, false, null);// Topic中有多少条数据未知,所以使用死循环接收数据,直到接收不到消息,退出死循环while (true) {// 创建响应接收数据,禁止自动发送Ack应答GetResponse response = channel.basicGet(topic, false);if (response != null) {AMQP.BasicProperties properties = response.getProps();// 获取附加属性对象Map<String, Object> map = properties.getHeaders();String messageId = map.get("messageId").toString();// 获取消息正文byte[] body = response.getBody();String message = new String(body);log.debug("从RabbitMQ接收的消息:" + message);MessageRefEntity entity = new MessageRefEntity();entity.setMessageId(messageId);entity.setReceiverId(Integer.parseInt(topic));entity.setReadFlag(false);entity.setLastFlag(true);// 把消息存储在MongoDB中messageService.insertRef(entity);// 数据保存到MongoDB后,才发送Ack应答,让Topic删除这条消息long deliveryTag = response.getEnvelope().getDeliveryTag();channel.basicAck(deliveryTag, false);i++;}else {// 接收不到消息,则退出死循环break;}}} catch (Exception e) {log.error("执行异常", e);throw new EmosException("接收消息失败");}return i;}@Asyncpublic int receiveAsync(String topic) {return receive(topic);}/*** 同步删除消息队列** @param topic 主题*/public void deleteQueue(String topic){try (Connection connection = factory.newConnection();Channel channel = connection.createChannel();) {channel.queueDelete(topic);log.debug("消息队列成功删除");}catch (Exception e) {log.error("删除队列失败", e);throw new EmosException("删除队列失败");}}@Asyncpublic void deleteQueueAsync(String topic){deleteQueue(topic);}}

http://chatgpt.dhexx.cn/article/St7kntpg.shtml

相关文章

【2023A题】电采暖负荷参与电力系统功率调节的技术经济分析(思路、代码)

目录 &#x1f4a5;1 概述 &#x1f4da;2 Matlab代码实现 &#x1f389;3 参考文献 &#x1f308;4 运行结果 &#x1f4a5;1 概述 建设以新能源为主体的新型电力系统是应对全球气候变化挑战的重要举措。高比例新能源接入导致电力系统调节能力稀缺&#xff0c;亟需开发新的调…

面向削峰填谷的电动汽车多目标优化调度策略

面向削峰填谷的电动汽车多目标优化调度策略 关键词&#xff1a;电动汽车 削峰填谷 多目标 充放电优化 参考文档&#xff1a;自己整理的说明文档&#xff0c;公式、约束、数据齐全 仿真平台&#xff1a;MATLAB YALMIPCPLEX 主要内容&#xff1a;代码主要实现了考虑电动汽车参与…

【电动车】基于削峰填谷的电动汽车多目标优化调度策略研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

面向削峰填谷的电动汽车多目标优化调度策略——附代码

目录 摘要&#xff1a; 背景介绍&#xff1a; 考虑V2G的电动汽车充放电模型&#xff08;无非凸约束&#xff09; 基于负荷实时变化的分时电价模型 充放电优化调度目标函数 &#xff08;1&#xff09;综合负荷成本以及电动汽车电池退化损耗成本 &#xff08;2&#xff09…

充电站储能削峰填谷方案设计测算报告

1、背景 近年来&#xff0c;为推进我国储能技术朝着商业化应用发展&#xff0c;国家出台了多项政策。从现有政策解读可知&#xff0c;虽然国家鼓励在用户侧建设分布式储能系统&#xff0c;但暂未出台针对用户侧电池储能的充放电标杆电价、容量补贴细则、充放电补贴细则、用户容…

MQ如何快速实现流量削峰填谷

问&#xff1a;站点与服务&#xff0c;服务与服务上下游之间&#xff0c;一般如何通讯&#xff1f; 答&#xff1a;有两种常见的方式 一种是“直接调用”&#xff0c;通过RPC框架&#xff0c;上游直接调用下游。 在某些业务场景之下&#xff08;具体哪些业务场景&#xff0c;见…

削峰填谷,你只知道消息队列?

https://baijiahao.baidu.com/s?id1707302054121107350&wfrspider&forpc 概述 今天想和大家聊聊削峰填谷&#xff0c;最近 B 站发生的机房断电事件&#xff0c;和A站的服务雪崩&#xff0c;让我们对高可用关注了起来&#xff0c;之前梳理了高可用三剑客 限流&#xff…

21.面向削峰填谷的电动汽车多目标优化调度策略

说明书 MATLAB代码&#xff1a;面向削峰填谷的电动汽车多目标优化调度策略 关键词&#xff1a;电动汽车 削峰填谷 多目标 充放电优化 参考文档&#xff1a;店主自己整理的说明文档&#xff0c;公式、约束、数据齐全&#xff0c;可联系我查看 仿真平台&#xff1a;MATLAB YA…

MQ,究竟如何做到削峰填谷?

MQ&#xff0c;很多的应用场景&#xff0c;是消息的订阅发布&#xff0c;是系统上下游的解耦&#xff0c;MQ的还有一个典型应用场景是缓冲流量&#xff0c;削峰填谷&#xff0c;本文将简单介绍下&#xff0c;MQ要怎么实现缓冲流量&#xff0c;削峰填谷。 站点与服务上下游之间&…

MQ实战-削峰填谷

对于突然到来的大量请求&#xff0c;您可以配置流控规则&#xff0c;以稳定的速度逐步处理这些请求&#xff0c;起到“削峰填谷”的效果&#xff0c;从而避免流量突刺造成系统负载过高。 1、场景 请求的到来&#xff0c;往往是没有规律的。 例如&#xff0c;某应用的处理能力…

MQ,如何做到削峰填谷

问&#xff1a;为什么会有本文&#xff1f; 答&#xff1a;上一篇文章《到底什么时候该使用MQ&#xff1f;》引起了广泛的讨论&#xff0c;有朋友回复说&#xff0c;MQ的还有一个典型应用场景是缓冲流量&#xff0c;削峰填谷&#xff0c;本文将简单介绍下&#xff0c;MQ要实现…

MATLAB代码:面向削峰填谷的电动汽车多目标优化调度策略

MATLAB代码&#xff1a;面向削峰填谷的电动汽车多目标优化调度策略 关键词&#xff1a;电动汽车 削峰填谷 多目标 充放电优化 参考文档&#xff1a;自己整理的说明文档&#xff0c;公式、约束、数据齐全 仿真平台&#xff1a;MATLAB YALMIPCPLEX 优势&#xff1a;代码注释详实&…

数据中心水蓄冷削峰填谷的经济性分析

摘要 结合国内三大城市的全年气象参数及大型数据中心常用的空调系统&#xff0c;分析数据中心在常用工况下&#xff0c;采用水蓄冷进行削峰填谷的经济性&#xff0c;并指出了大型数据中心采用削峰填谷措施具有良好的经济性。 关键词 &#xff1a;削峰填谷 &#xff1b;数据中心…

01-初探MQ-MQ的三大使用场景:应用解耦、异步提速、削峰填谷

初探MQ 什么是MQ 关于MQ的概念&#xff0c;想必都不陌生&#xff0c;MQ是 Message Queue&#xff08;消息队列&#xff09; 的缩写&#xff0c;所以他首先是一个队列&#xff0c;有先进先出的特性&#xff0c;其次是一个存放消息的队列。常用在分布式系统中进行通信。 为什么…

设计一个秒杀系统之削峰填谷

为什么需要削峰&#xff1f; 如果你看过秒杀系统的流量监控图的话&#xff0c;你会发现它是一条直线&#xff0c;就在秒杀开始那一秒是一条很 直很直的线&#xff0c;这是因为秒杀请求在时间上高度集中于某一特定的时间点。这样一来&#xff0c;就会导致一 个特别高的流量峰值…

电力系统的削峰填谷

削峰填谷&#xff08;Peak cut&#xff09;是调整用电负荷的一种措施。根据不同用户的用电规律&#xff0c;合理地、有计划地安排和组织各类用户的用电时间。以降低负荷高峰&#xff0c;填补负荷低谷。减小电网负荷峰谷差&#xff0c;使发电、用电趋于平衡。 因电厂是全天候持续…

t分布概率密度函数的推导

推导过程整理自https://www.bilibili.com/video/BV1s54y1S7Ji。 文章目录 预备知识 Γ \Gamma Γ函数&#xff08;伽马函数&#xff09;标准正态分布卡方分布 推导目标引理&#xff1a;连续型随机变量商的分布推导过程先计算 W Y / n W\sqrt{Y/n} WY/n ​的概率密度函数 p W (…

求概率密度函数方法之单调性定理

例题&#xff1a; 适用条件&#xff1a;随机变量Y关于X是单调的&#xff0c;也就是说随机变量Y与X存在一一映射的关系。 解法好处&#xff1a;计算量小&#xff0c;步骤简单&#xff08;1&#xff0c;将变量替换&#xff0c;然后带入原式。2&#xff0c;改变积分对象&#xf…

概率密度估计方法-核密度估计和高斯混合分布

1、概率密度估计方法 概率密度估计方法用于估计一组数据集的概率密度分布&#xff0c;分为参数估计方法和非参数估计方法。 参数估计方法 假定样本集符合某一概率分布&#xff0c;然后根据样本集拟合该分布中的参数&#xff0c;例如&#xff1a;似然估计&#xff0c;混合高斯等…

概率密度函数及其在信号方面的简单理解(上)概率密度函数

概率密度函数及其在信号方面的简单理解&#xff08;上&#xff09;概率密度函数 上篇 概率密度函数 1 离散随机变量与连续型随机变量2 离散随机变量的分布函数 2.1 概率函数2.2 概率分布2.3 概率分布函数&#xff08;累积分布函数&#xff01;&#xff09; 3 连续型随机变量的概…