RabbitMQ使用规范
RabbitMQ使用规范
命名
- exchange:{模块名}.{功能名}
- queue:{word}.{word}
- routing key:{word}.{word},例:merge.request,原因:
.
之间的会被认为是一个单词,便于通过*和#来匹配一个或多个单词
序列化
默认情况下RabbitMQ发送的消息是为字节码,我们采用统一的JSON格式的消息
使用MessageConvert自动转换为JSON
如果规定了消息的格式为JSON,并使用消息转换器,则会自动将消息转化为JSON格式而不需要每次手动进行转换。RabbitTemplate默认使用SimpleMessageConverter作为自己的消息转化器,而SimpleMessageConverter并不能满足JSON消息的需求。我们可以使用Jackson2JsonMessageConverter作为默认的消息转换器。
特别注意:
生产者和消费者需要使用相同的MessageConvert,消息类型可通过header中的content-type来确认
对于String类型的消息,
SimpleMessageConverter
和Jackson2JsonMessageConverter
的处理策略是不一样的,具体提现为:content-type:分别是
text/plain
和application/json
Jackson2JsonMessageConverter会多出两个双引号
" "
从而导致字符串大变样,示例如下:生产者代码
String context = "hello \"rabbitMQ\" "; rabbitTemplate.convertAndSend("hello", context);
当使用SimpleMessageConverter时,rabbitMQ队列中的消息:
hello "rabbitMQ"
当使用Jackson2JsonMessageConverter时,rabbitMQ队列中的消息:
"hello \"rabbitMQ\" "
如果想要在发送消息时自定义格式,请使用
send
而不是conertAndSend
方法,接收方也请使用receive
而不是receiveAndConvert
为RabbitTemplate配置MessageConverter:
@Configuration
public class RabbitConfig {@Beanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setMessageConverter(jsonMessageConverter());return rabbitTemplate;}@Beanpublic Jackson2JsonMessageConverter jsonMessageConverter() {return new Jackson2JsonMessageConverter();}
}
配置优化
生产者消息确认机制
spring:rabbitmq:#确认消息已发送到交换机(Exchange)publisher-confirms: true#确认消息已发送到队列(Queue)publisher-returns: true
@Slf4j
@Configuration
public class RabbitConfig {@Beanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setMessageConverter(jsonMessageConverter());// 开启交换机确认rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {log.info("=======ConfirmCallback=========");log.info("correlationData = " + correlationData);log.info("ack = " + ack);log.info("cause = " + cause);log.info("=======ConfirmCallback=========");}});// 开启队列失败确认rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {@Overridepublic void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {log.info("--------------ReturnCallback----------------");log.info("message = " + message);log.info("replyCode = " + replyCode);log.info("replyText = " + replyText);log.info("exchange = " + exchange);log.info("routingKey = " + routingKey);log.info("--------------ReturnCallback----------------");}});return rabbitTemplate;}
}
本地重试确认机制
spring: rabbitmq:listener:simple:retry:# 开启本地重试机制,默认3次,避免内存泄漏enabled: true
RabbitMQ使用规范相关推荐
- spring boot 集成sleuth
spring boot 集成sleuth 1. 理论 1.1 sleuth是什么 1.2 sleuth有哪些 1.3 链路追踪的一些基本概念 1.4 zipkin的组成 2. zipkin 实例 2. ...
- 别人家的团队怎么用RabbitMQ:我总结的5点规范
大概从 2013 年开始,我就开始了自己和 RabbitMQ 的接触,到现在已经有七年多了. 在这七年中,既有一些对 RabbitMQ 的深度体验,更有无数的血泪史. 而根据我这么多年的使用经验,我将 ...
- springboot-26-springboot 集成rabbitmq
rabbitmq是基于AMQP规范的一个消息代理, 它可以兼容jms, 支持其他语言, 并且可以跨平台 1, 安装 1) 普通安装 度娘: 2) docker 安装 sudo docker run - ...
- Java 命名规范(非常全)
欢迎关注方志朋的博客,回复"666"获面试宝典 在本文中,将从大到小,从外到内,总结Java编程中的命名规范.文中将会涉及到日常工作中常见的命名示例,如包命名,类命名,接口命名,方 ...
- JMS规范、ActiveMQ Broker和ActiveMQ传输协议
Java实现ActiveMQ通讯(构建过程) 编写pom.xml配置文件 <!-- https://mvnrepository.com/artifact/org.apache.activemq/ ...
- Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么优点和缺点?
面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 面试官心理分析 其实面试官主要是想看看: ...
- rabbitmq实战:高效部署分布式消息队列_一文看懂消息队列中间件--AMQ及部署介绍...
概述 最近有个小项目用到了AMQ来做消息队列,之前介绍的主要是rabbitmq,所以今天主要提一下AMQ,也简单介绍下两者的区别~ 消息队列中间件 消息队列中间件(简称消息中间件)是指利用高效可靠的消 ...
- Java 访问RabbitMQ
一.概述 前面学过ActiveMQ.ActiveMQ主要是实现的JMS规范,而RabbitMQ就是AMQP的一个具体实现. RabbitMQ里面有几个概念:生产者.消费者.消息.交换器.路由键.队列. ...
- 【消息中间件】浅谈中间件优缺RabbitMQ基本使用
消息中间件概述 MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法.是在消息的传输过程中保存消息的容器.多用于分布式系统之间进行通信. 为什么使用MQ 在项目中,可将一些 ...
- Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用原理
为什么使用消息队列 其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么? 面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务 ...
最新文章
- Juniper SRX IPsec *** base route CLI
- vue 如何点击按钮返回上一页
- 组队瓜分百万奖金池,资深算法工程师带你挑战飞桨论文复现赛!
- VDI序曲二 RemotoAPP部署
- php的cms是什么意思,phpcms是什么系统
- Maven实战 | dependencies与dependencyManagement
- 【英语学习】【Daily English】U06 Shopping L03 What sort of market are you looking for?
- VC9、VC11、VC14、VC15库 最新下载链接
- 网页中打开msn窗口方法
- 用Wineskin 让Windows 的程序在Mac 上运行
- SSD固态硬盘检测工具AS SSD参数
- STM32F205RBT6的USB_BULK数据传输,并使用libusb_win32编写上位机进行数据读写,配有pcb文件
- 微信小程序 图片上传预览删除
- [渝粤教育] 新乡医学院三全学院 医学分子生物学 参考 资料
- 5G LTE窄带物联网(NB-IoT) 6
- 《通信技术导论(原书第5版)》——2.8 增值电话应用系统
- premiere pr 自动调色对比度 用法
- 火遍抖音的3D旋转特效
- 【GPT4】微软 GPT-4 测试报告(6)与人类的交互能力
- B站入局直播电商,流量的终点就是带货?