Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RabbitMq消息发送

RabbitMq消息发送

作者头像
写一点笔记
发布于 2022-08-11 07:52:51
发布于 2022-08-11 07:52:51
1.2K00
代码可运行
举报
文章被收录于专栏:程序员备忘录程序员备忘录
运行总次数:0
代码可运行

如果要发送一个消息,可以使用channel类的basicPublish方法参考如下,其中在rabbitmqTemplate中封装的方式是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rabbitMqTemplate.send(RabbitConstant.MESSAGE_EXCHANGE, "", Message对象);

其对应的底层方法:convertedMessageProperties为message对象中设置的对象属性信息,也就是下边的messageProperties 。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
channel.basicPublish(exchange, routingKey, mandatory, convertedMessageProperties, message.getBody());

我们发送的消息(Message对象)包括消息体和消息的一些描述信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//生成消息体
byte[] body = JSON.toJSONBytes(message, SerializeConfig.globalInstance);
 //设置消息相关属性
MessageProperties messageProperties = new MessageProperties();
//设置消息的序列号,对消息进行标记
messageProperties.setMessageId(UUID.randomUUID().toString());
//设置内容的格式
messageProperties.setContentType(MediaType.APPLICATION_JSON_VALUE);
//设置userId
messageProperties.setUserId("hidden");
//设置头信息,可以在消息被消费的时候进识别,
// 然后监听者通过message.getMessageProperties().getHeader()可以拿到设置的值
messageProperties.setHeader("h",1);
//设置投递模式,2表示会持久化,1表示不持久化
messageProperties.setDeliveryMode(MessageDeliveryMode.PERSISTENT);
//设置优先级,优先级越高的相比优先级低的会提前消费掉
messageProperties.setPriority(1);
//消息的过期时间,
messageProperties.setExpiration("60000");
//封装一个消息(消息体内容,消息配置信息),消息的配置信息可以做一些鉴别作用
 return new Message(body, messageProperties);

发送消息的方法所对应的关键配置解析:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
channel.basicPublish(exchange, routingKey, mandatory, convertedMessageProperties, message.getBody());

exchange:交换机的名称,需要指名消息需要发送到那个交换机中,如果设置为空字符串,消息会被发送到默认交换机中。

routingKey路由键,交换器根据路由键将消息存储到相应的队列中!

convertedMessageproperties:消息的描述信息,有headers、deliveryModel、priority、correlationid、replyto、expiration、messageId、timestemp、type、userId、appId、clusterId等。

byte[]:消息体,真实要发送的消息。

mandatory和immediate:channel.basicPublish方法中的两个参数,他们都有当消息传递过程中不可达目的地的时候将消息返回给生产者的功能,rabbitmq提供的备份交换机可以将未能被交换器路由的消息存储起来,而不用返回给客户端。mandatory为true,rabbitmq根据路由无法将消息投递出去的时候就会将消息返回给客户端,为false的时候就会直接抛弃该消息。

immediate:为true,如果交换机在将消息路由到队里时候发现队列并不存在任何消费者的时候,那这条消息将不会存入队列,当与路由键匹配的所有队列都没有消费者的时候该消息会通过basic.reture返回给生产者。

概括来说mandatory参数告诉服务器至少将该消息路由到一个队列,否则会返回该生产者。immediate参数则告诉服务器,如果该消息关联的队列上有消费者则立即投递,如果所有匹配的队列都没有消费者,则返回给生产者。不用将消息存入队列而等待消费者。rabbitmq 3.0中已经去掉immediate参数,immediate会影响队列性能,增加代码复杂度,建议采用ttl和dlx方法替代。 《RabbitMq实战指南》

在方法的底层我们发现this.returnCallBack不为null的时候才会有可能mandatory为true,然后才有可能在投送的时候没有相应队列然后返回给生产者的可能。因为我们需要在rabbitmqTemplate中设置returnCallback。

具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
//设置没有路由队列的时候返回给客户端
rabbitTemplate.setMandatory(true);
//设置消费确认消息
rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> log.info("消息发送成功:correlationData({}),ack({}),cause({})", correlationData, ack, cause));
//设置没有路由队列返回客户端消息
rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> log.info("消息丢失:exchange({}),route({}),replyCode({}),replyText({}),message:{}", exchange, routingKey, replyCode, replyText, message));
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写点笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RabbitMQ之消息可靠性投递解读
producer->exchange:确保消息发送到RabbitMQ服务器的交换机上
一个风轻云淡
2023/10/13
6330
如何避免RabbitMQ消息丢失?
面试经常会被问到“怎么避免RabbitMQ消息不丢失”。首先需要明确的是,RabbitMQ在默认情况并不会保证消息的不丢失。不过RabbitMQ提供了一些机制,可以有效的避免消息在传输和处理过程中不丢失。
闻说社
2024/08/12
5070
如何避免RabbitMQ消息丢失?
SpringBoot RabbitMQ 实战
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
默存
2022/06/24
5100
SpringBoot RabbitMQ 实战
缓存架构之史上讲的最明白的RabbitMQ可靠消息传输实战演练
比如:某个广告主(如:天猫)想在我们的平台(如:今日头条)投放广告,当通过我们的广告系统新建广告的时候,该消息在同步给redis缓存(es)的时候丢失了,而我们又没有发现,造成该广告无法正常显示出来,那这损失就打了,如果1天都没有该广告的投放记录,那就有可能是上百万的损失了,所以消息的可靠传输多我们的广告系统也是很重要的。 其实,生活中这样的场景很场景,再比如:交易系统、订单系统都必须保证消息的可靠传输,否则,损失是巨大的!!!
Java知音
2018/09/26
8040
RabbitMQ 发布确认高级
在生产环境中由于一些不明原因,导致 RabbitMQ 重启,在 RabbitMQ 重启期间生产者消息投递失败,导致消息丢失,需要手动处理和恢复。于是,我们开始思考,如何才能进行 RabbitMQ 的消息可靠投递呢?
用户9615083
2022/12/25
8970
RabbitMQ 发布确认高级
RabbitMQ如何保证消息的可靠性
如何做到以上几点?RabbitMQ为了适应各个场景的使用,以上的功能需要开发者按照定义自行设置实现。
王二蛋
2024/02/07
2950
RabbitMQ之消息可靠性问题(含Demo工程)
https://gitee.com/boring-yingjie/rabbit-mq-message-confirmation.git
叫我阿杰好了
2022/11/07
8710
RabbitMQ之消息可靠性问题(含Demo工程)
rabbitmq消息的发布确认
说明:由于 rabbitTemplate.setMandatory(true),所以当无法到达交换机的时候也会回调
九转成圣
2024/04/10
2220
rabbitmq消息的发布确认
快速入门RabbitMQ并且加入项目实战
📣 📣 📣 📢📢📢 ☀️☀️你好啊!小伙伴,我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 📒 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️,擅长使用Java技术开发web项目和工具 📒 文章内容丰富:覆盖大部分java必学技术栈,前端,计算机基础,容器等方面的文章 📒 如果你也对Java感兴趣,关注小冷吧,一起探索Java技术的生态与进步,一起讨论Java技术的使用与学习 ✏️高质量技术专栏专栏链接: 微服务,数据结构,netty,单点登录,SSM ,SpringCloud
冷环渊
2022/11/12
1.3K0
快速入门RabbitMQ并且加入项目实战
【RabbitMQ】如何进行消息可靠投递【下篇】
上一篇文章里,我们了解了如何保证消息被可靠投递到RabbitMQ的交换机中,但还有一些不完美的地方,试想一下,如果向RabbitMQ服务器发送一条消息,服务器确实也接收到了这条消息,于是给你返回了ACK确认消息,但服务器拿到这条消息一看,找不到路由它的队列,于是就把它丢进了垃圾桶,emmm,我猜应该属于可回收垃圾。
弗兰克的猫
2019/09/29
5260
【RabbitMQ】如何进行消息可靠投递【下篇】
RabbitMQ之发布确认高级
  在生产环境中由于一些不明原因,导致 rabbitmq 重启,在 RabbitMQ 重启期间生产者消息投递失败, 导致消息丢失,需要手动处理和恢复。于是,我们开始思考,如何才能进行 RabbitMQ 的消息可靠投递呢? 特别是在这样比较极端的情况,RabbitMQ 集群不可用的时候,无法投递的消息该如何处理呢:
别团等shy哥发育
2023/02/25
6250
RabbitMQ之发布确认高级
RabbitMQ生产端消息可靠性投递方案分析
导文: 1.什么是RabbitMQ 2.Java开发技术大杂烩(三)之电商项目优化、rabbitmq、Git、OSI、VIM、Intellj IDEA、HTTP、JS、Java
用户2032165
2018/12/07
1.9K0
springboot + rabbitmq 用了消息确认机制,感觉掉坑里了
最近部门号召大伙多组织一些技术分享会,说是要活跃公司的技术氛围,但早就看穿一切的我知道,这 T M 就是为了刷KPI。不过,话说回来这的确是件好事,与其开那些没味的扯皮会,多做技术交流还是很有助于个人成长的。
程序员小富
2020/07/01
8090
springboot + rabbitmq 用了消息确认机制,感觉掉坑里了
RabbitMQ消息的发布确认机制详解
RabbitMQ发布确认机制确保消息从生产者成功传输到交换机和队列,提高系统可靠性。在Spring Boot项目中,通过配置publisher-confirm-type和publisher-returns,启用发布确认和消息返回机制。配置RabbitTemplate的确认回调和返回回调,可以捕捉消息传输状态,处理不同传输结果。测试场景包括消息无法到达交换机、消息到达交换机但无法到达队列以及消息成功到达队列。通过合理设置和优化,可以确保高并发环境下的消息可靠传输,适用于金融支付、电商系统等对消息传输可靠性要求高的场景。
九转成圣
2024/06/05
1.5K0
RabbitMQ消息的发布确认机制详解
RabbitMQ消息发送、消费和确认
前一篇文章介绍到RabbitMQ相关组件的声明,组件声明完成之后,就可以发送消息和消费消息,消费消息的时候需要考虑消息的确认。
Throwable
2020/06/23
4.7K0
RabbitMQ消息路由失败的处理方案(回调与备份交换机AE)
我们知道,消息在RabbitMQ的整个生命周期是生产者投递消息到Exchange,Exchange根据路由键将消息路由到合适的Queue,Queue再将消息推(或消费者主动拉)给消费者。
喜欢天文的pony站长
2021/03/05
1.3K0
RabbitMQ消息路由失败的处理方案(回调与备份交换机AE)
RabbitMQ高级特性之消费端限流
假设我们现在有这么一个场景,我们的消费端由于某些原因导致全部宕机等不可用,导致RabbitMQ服务器队列中存储了大量消息未被消费掉,那么等恢复消费端服务器后,就会有巨大量的消息全部推送过来,但是我们单个客户端无法同事处理这么多消息,就是导致消费端一些不可预测错误,甚至又会重复发生宕机,所以在实际业务场景中,限流保护还是非常重要的。
黎明大大
2021/03/08
8220
RibbitMQ学习笔记之发布确认高级
在生产环境中由于一些不明原因,导致 rabbitmq 重启,在 RabbitMQ 重启期间生产者消息投递失败,导致消息丢失,需要手动处理和恢复。于是,我们开始思考,如何才能进行 RabbitMQ 的消息可靠投递呢? 特别是在这样比较极端的情况,RabbitMQ 集群不可用的时候,无法投递的消息该如何处理呢:
默 语
2024/11/20
1290
RibbitMQ学习笔记之发布确认高级
Rabbitmq可靠消息投递,消息确认机制
Producer-->Broker/Exchange-->Broker/Queue-->Consumer,因此如果只是要保证消息的可靠投递,我们需要考虑的仅是前两个阶段,因为消息只要成功到达队列,就算投递成功。
vivi
2021/01/18
7380
分布式--RabbitMQ集成SpringBoot、消息可靠性、死信队列、延迟交换机、集群
SpringBoot中使用RabbitTemplate自动注入,即可发送消息,并对方法都进行了封装
aruba
2022/09/19
6540
分布式--RabbitMQ集成SpringBoot、消息可靠性、死信队列、延迟交换机、集群
相关推荐
RabbitMQ之消息可靠性投递解读
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档