RabbitMQ使用规范「建议收藏」

RabbitMQ使用规范「建议收藏」RabbitMQ使用规范命名exchange:{模块名}.{功能名}queue:{word}.{word}routingkey:{word}.{word},例:merge.request,原因:.之间的会被认为是一个单词,便于通过*和#来匹配一个或多个单词序列化默认情况下RabbitMQ发送的消息是为字节码,我们采用统一的JSON格式的消息使用MessageConvert自动转换为JSON如果规定了消息的格式为JSON,并使用消息转换器,则会自动将消息转化为JSON格式而不需要每次

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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 { 
   

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { 
   
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(jsonMessageConverter());
        return rabbitTemplate;
    }

    @Bean
    public Jackson2JsonMessageConverter jsonMessageConverter() { 
   
        return new Jackson2JsonMessageConverter();
    }
}

配置优化

生产者消息确认机制

spring:
	rabbitmq:
		#确认消息已发送到交换机(Exchange)
		publisher-confirms: true
		#确认消息已发送到队列(Queue)
		publisher-returns: true
@Slf4j
@Configuration
public class RabbitConfig { 
   

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { 
   
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(jsonMessageConverter());
      
      	// 开启交换机确认
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { 
   
              @Override
              public 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() { 
   
              @Override
              public 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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/186246.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 多线程处理mq消息_实现多线程有几种方式

    多线程处理mq消息_实现多线程有几种方式何为CMQ?腾讯云消息队列(CloudMessageQueue,CMQ)是一种分布式消息队列服务,它能够提供可靠的基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)之间的收发消息,存储在可靠有效的CMQ队列中,防止消息丢失。CMQ支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。——来源以及更多内容推荐看官方文档。…

    2025年7月8日
    4
  • Windows 10 本地 IIS Web服务器搭建

    Windows 10 本地 IIS Web服务器搭建IIS服务器搭建启用功能①右击我的电脑点击属性,进入windows10控制面板。然后点击控制面板②点击进入程序和功能,然后点击启用或关闭windows功能,打开windows功能窗口,选择InternetInformationServices选项,将里面的内容全部勾选。如图:③勾选完成后,点击确定按钮,windows自动安装IIS功能,完成…

    2022年5月11日
    52
  • js的6种数据类型_主要的数据类型

    js的6种数据类型_主要的数据类型JS常用的六种数据类型在JS中一共有九种数据类型,有六种基本数据类型,分别是:String(字符串)、Number(数值)、Boolean(布尔值)、Null(空值)、Undefined(未定义)、Object(对象)String字符串在JS中字符串需要使用引号引起来使用双引号或单引号都行,但是不要混着用引号不能嵌套,双引号不能放双引号,单引号不能放单引号在字符串中我们可以使用\作为转义字符,当表示一些特殊符号是可以使用\进行转义\“表示”、\‘表示’、\n表示换行、\t制表符

    2025年9月20日
    7
  • c语言sigaction,使用的sigaction(),C(Using sigaction(), c)

    c语言sigaction,使用的sigaction(),C(Using sigaction(), c)让我们试着去了解什么是你的代码的修改版本发生:#include#includevoidtermination_handler(intsignum){printf(“Hellofromhandler\n”);sleep(1);}intmain(void){//Structsthatwilldescribetheoldactionandthenewaction//a…

    2022年5月25日
    42
  • postman安装使用教程(标贝科技)「建议收藏」

    postman安装使用教程(标贝科技)「建议收藏」postman安装使用教程文章目录postman安装使用教程前言一、postman安装二、postman使用前言postman是Chrome浏览器的插件,是一款功能强大的网页调试工具(接口调试神器)一、postman安装1.下载:https://www.postman.com/downloads/2.安装双击postman应用程序进入到postman主界面,如下证明安装成功3.界面主要功能介绍二、postman使用1.状态码解释各位小伙伴可以学习一下关于接口

    2026年1月18日
    4
  • vc插件是什么_PE和VC

    vc插件是什么_PE和VC从进大一到现在这么久的时间,用VC软件应该是最熟练的,可是我竟然不知道一些关于它的小插件,每一次看到宿舍小五编程序,偶尔让我看她的有些代码,每次看她的代码,花花绿绿的,而我的,黑压压的一片,顿时心情就不好了。然后问:你用的什么软件答:一个西红柿小插件问:这是干什么用的?答:功能多了去了问:什么功能:答:百度去。。。之后我从百度上查到的结果是:西红柿软件也

    2022年8月12日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号