RabbitMQ使用规范

命名

  1. exchange:{模块名}.{功能名}
  2. queue:{word}.{word}
  3. routing key:{word}.{word},例:merge.request,原因:.之间的会被认为是一个单词,便于通过*和#来匹配一个或多个单词

序列化

默认情况下RabbitMQ发送的消息是为字节码,我们采用统一的JSON格式的消息

使用MessageConvert自动转换为JSON

如果规定了消息的格式为JSON,并使用消息转换器,则会自动将消息转化为JSON格式而不需要每次手动进行转换。RabbitTemplate默认使用SimpleMessageConverter作为自己的消息转化器,而SimpleMessageConverter并不能满足JSON消息的需求。我们可以使用Jackson2JsonMessageConverter作为默认的消息转换器。

特别注意:

  • 生产者和消费者需要使用相同的MessageConvert,消息类型可通过header中的content-type来确认

  • 对于String类型的消息,SimpleMessageConverterJackson2JsonMessageConverter的处理策略是不一样的,具体提现为:

    • content-type:分别是text/plainapplication/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使用规范相关推荐

  1. spring boot 集成sleuth

    spring boot 集成sleuth 1. 理论 1.1 sleuth是什么 1.2 sleuth有哪些 1.3 链路追踪的一些基本概念 1.4 zipkin的组成 2. zipkin 实例 2. ...

  2. 别人家的团队怎么用RabbitMQ:我总结的5点规范

    大概从 2013 年开始,我就开始了自己和 RabbitMQ 的接触,到现在已经有七年多了. 在这七年中,既有一些对 RabbitMQ 的深度体验,更有无数的血泪史. 而根据我这么多年的使用经验,我将 ...

  3. springboot-26-springboot 集成rabbitmq

    rabbitmq是基于AMQP规范的一个消息代理, 它可以兼容jms, 支持其他语言, 并且可以跨平台 1, 安装 1) 普通安装 度娘: 2) docker 安装 sudo docker run - ...

  4. Java 命名规范(非常全)

    欢迎关注方志朋的博客,回复"666"获面试宝典 在本文中,将从大到小,从外到内,总结Java编程中的命名规范.文中将会涉及到日常工作中常见的命名示例,如包命名,类命名,接口命名,方 ...

  5. JMS规范、ActiveMQ Broker和ActiveMQ传输协议

    Java实现ActiveMQ通讯(构建过程) 编写pom.xml配置文件 <!-- https://mvnrepository.com/artifact/org.apache.activemq/ ...

  6. Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么优点和缺点?

    面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 面试官心理分析 其实面试官主要是想看看: ...

  7. rabbitmq实战:高效部署分布式消息队列_一文看懂消息队列中间件--AMQ及部署介绍...

    概述 最近有个小项目用到了AMQ来做消息队列,之前介绍的主要是rabbitmq,所以今天主要提一下AMQ,也简单介绍下两者的区别~ 消息队列中间件 消息队列中间件(简称消息中间件)是指利用高效可靠的消 ...

  8. Java 访问RabbitMQ

    一.概述 前面学过ActiveMQ.ActiveMQ主要是实现的JMS规范,而RabbitMQ就是AMQP的一个具体实现. RabbitMQ里面有几个概念:生产者.消费者.消息.交换器.路由键.队列. ...

  9. 【消息中间件】浅谈中间件优缺RabbitMQ基本使用

    消息中间件概述 MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法.是在消息的传输过程中保存消息的容器.多用于分布式系统之间进行通信. 为什么使用MQ 在项目中,可将一些 ...

  10. Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用原理

    为什么使用消息队列 其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么? 面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务 ...

最新文章

  1. Juniper SRX IPsec *** base route CLI
  2. vue 如何点击按钮返回上一页
  3. 组队瓜分百万奖金池,资深算法工程师带你挑战飞桨论文复现赛!
  4. VDI序曲二 RemotoAPP部署
  5. php的cms是什么意思,phpcms是什么系统
  6. Maven实战 | dependencies与dependencyManagement
  7. 【英语学习】【Daily English】U06 Shopping L03 What sort of market are you looking for?
  8. VC9、VC11、VC14、VC15库 最新下载链接
  9. 网页中打开msn窗口方法
  10. 用Wineskin 让Windows 的程序在Mac 上运行
  11. SSD固态硬盘检测工具AS SSD参数
  12. STM32F205RBT6的USB_BULK数据传输,并使用libusb_win32编写上位机进行数据读写,配有pcb文件
  13. 微信小程序 图片上传预览删除
  14. [渝粤教育] 新乡医学院三全学院 医学分子生物学 参考 资料
  15. 5G LTE窄带物联网(NB-IoT) 6
  16. 《通信技术导论(原书第5版)》——2.8 增值电话应用系统
  17. premiere pr 自动调色对比度 用法
  18. 火遍抖音的3D旋转特效
  19. 【GPT4】微软 GPT-4 测试报告(6)与人类的交互能力
  20. B站入局直播电商,流量的终点就是带货?

热门文章

  1. 女生学前端适合么?新人应该怎么学习?
  2. 用python查询生成国内法定节假日安排
  3. 高中计算机矩阵算法ppt,高中信息技术教科版必修1 数据与计算4.2 数值计算一等奖课件ppt...
  4. 工业相机镜头的视场角、焦距、光圈和景深的关系
  5. 空气负氧离子监测系统建设方案
  6. Android 图片查看器选择器 PictureSelector
  7. 视频技术系列 - 谈谈毫米波
  8. 实用的网页模板(一)
  9. 乔布斯在斯坦福大学的演讲
  10. Lucene.Net+盘古分词器(详细介绍)