【消息通过rabbitTemplate.converAndSend发送后请求头丢失】

这篇具有很好参考价值的文章主要介绍了【消息通过rabbitTemplate.converAndSend发送后请求头丢失】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

问题:

解决:

原因

扩展

问题:

版本:springboot版本:2.3.4.RELEASE  amqp-client:5.9.0

问题:封装的消息通过rabbitTemplate.converAndSend发送后没有请求头

排查:通过debug构建消息时数据是否完整 > 请求头有数据

思路:换成 send发送进行对比

解决:

代码如下:

1. send 发送 org.springframework.amqp.core.Message

@Test
   public void testSendMessage3() throws Exception {
       // send
       MessageProperties messageProperties = new MessageProperties();
       messageProperties.setMessageId("123412341");
       org.springframework.amqp.core.Message message = new Message("mq 消息1234".getBytes(), messageProperties);
       // send方法只能传消息对象
       rabbitTemplate.send("", "15", message);
  }

【消息通过rabbitTemplate.converAndSend发送后请求头丢失】

2. convertAndSend 发送org.springframework.messaging.Message

@Test
   public void testSendMessage4() throws Exception {
       // convertAndSend
       HashMap<String, Object> properties = Maps.newHashMap();
       properties.put("messageId", "134124");
       MessageHeaders messageHeaders = new MessageHeaders(properties);
       // 创建消息
       org.springframework.messaging.Message msg = MessageBuilder.createMessage(message, messageHeaders);
       // convertAndSend会把数据转换为 message
       rabbitTemplate.convertAndSend("", "12", msg,new CorrelationData("166666"));
  }

【消息通过rabbitTemplate.converAndSend发送后请求头丢失】

3. convertAndSend 发送 org.springframework.amqp.core.Message

@Test
    public void testSendMessage3() throws Exception {

        // send
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setMessageId("666666999");
        org.springframework.amqp.core.Message message = new Message("mq 消息1234".getBytes(), messageProperties);
        rabbitTemplate.convertAndSend("", "12", message, new CorrelationData("34234"));
    }

【消息通过rabbitTemplate.converAndSend发送后请求头丢失】

 

原因

1. 对象用混了, rabbitTemplate是org.springframework.amqp.core包下的,所以使用org.springframework.amqp.core包下的Message对象就不会有问题,而使用org.springframework.messaging包下的Message对象就会有请求头丢失问题,版本兼容性不好,容易出千奇百怪的问题。

因祸得福让我了解了rabbitTemplate.convertAndSend的特性,下面是这个API的讲解

扩展

 rabbitTemplate.convertAndSend 方法发送消息时,该方法会自动将消息体转换为 byte[] 数组,并将其发送到 RabbitMQ 交换器中。但是,该方法默认情况下并不会设置消息头信息。原因如下:

在 RabbitMQ 中,消息头包含一些元数据,例如消息类型、编码、过期时间、优先级和路由键等,这些元数据会帮助 RabbitMQ 路由和分发消息。由于不同的应用程序和场景需要的消息头可能不同,因此 RabbitMQ 采用了一种灵活的方式,即让发送方在发送消息时自己设置消息头。

因此,在使用 rabbitTemplate.convertAndSend 方法发送消息时,默认情况下不会设置消息头信息。如果需要在消息中设置自定义的消息头信息,可以使用 MessagePostProcessor 接口来在发送消息之前修改消息头。

例如,以下示例使用 MessagePostProcessor 接口将一个名为 myHeader 的自定义消息头添加到消息中:文章来源地址https://www.toymoban.com/news/detail-440437.html

rabbitTemplate.convertAndSend(exchangeName, routingKey, message, new MessagePostProcessor() {
    @Override
    public Message postProcessMessage(Message message) throws AmqpException {
        message.getMessageProperties().setHeader("myHeader", "myValue");
        return message;
    }
});

到了这里,关于【消息通过rabbitTemplate.converAndSend发送后请求头丢失】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通过 HttpClient 发送请求

    2024年02月12日
    浏览(43)
  • 什么是mq?可靠性、重复消息、重复消费、丢失、发送大文件、延迟、发送机制、重试、死信、幂等、有序、大小、过期、优先级、进了死信队列还能出来吗?

    “MQ” 指的是消息队列(Message Queue),是一种用于异步通信的技术。消息队列是一种中间件,用于在分布式系统中传递消息,使不同组件之间能够进行松散耦合的通信。它的核心思想是生产者将消息发送到队列,而消费者从队列中接收并处理消息。 消息队列的主要优点包括

    2024年02月06日
    浏览(45)
  • 微信小程序通过公众号服务号发送消息

    一、基础概念: 准备条件:      1、公众号和小程序必须在同一个公司主体下。      2、在公众号后台需要对小程序进程绑定操作。 公众号提供了两种消息,一种是订阅消息,一种是模板消息。 订阅消息需要用户主动订阅,然后才能接收消息,微信提供前端组件用于用户进

    2024年02月07日
    浏览(37)
  • 第二十五章 开发Productions - ObjectScript Productions - 发送请求消息

    在业务服务类中, OnProcessInput() 实现应该将请求消息发送到生产中的某个目的地。为此,根据需要调用业务服务类的以下实例方法之一: SendRequestSync() 同步发送消息(等待响应)。有关详细信息,请参阅使用 SendRequestSync() 方法。 - SendRequestAsync() 异步发送消息(不等待响应)

    2024年02月07日
    浏览(42)
  • python飞书群机器人通过webhook发送消息

    python飞书群机器人通过webhook发送消息

    2024年02月06日
    浏览(49)
  • 通过HttpPost发送http请求实现文件上传

    通过HttpPost发送http请求,实现postman上传文件效果 需要引入: ** 关键代码:multipartEntityBuilder.addBinaryBody ** 如还需传入其他文本参数:如下图 本人亲自验证有效。

    2024年02月12日
    浏览(31)
  • WhatsApp CRM:通过 CRM WhatsApp 集成向客户发送消息

    WhatsApp CRM:通过 CRM WhatsApp 集成向客户发送消息 你是否在寻找一个支持WhatsApp整合的CRM?或者,你想将WhatsApp与你当前的CRM整合?这篇文章将回答你所有的问题。我们将首先了解什么是WhatsApp CRM,以及你需要知道的关于CRM WhatsApp整合的内容。 然后,我们会告诉你为什么你需要

    2024年02月02日
    浏览(28)
  • 前端 axios 通过 get 请求发送 json 数据

    先说结论: axios 不能通过 get 请求发送 json 数据 使用 postman 可以做到通过 get 请求发送 json 数据 但是通过 axios 框架就不行, 主要是因为axios是对ajax的一个封装。他本身不支持get请求在body体传参。 原生和jquery的ajax是支持的。建议跟后端沟通,你把json拼在url后面,后端从url的

    2024年02月11日
    浏览(49)
  • C# 通过 HttpWebRequest发送数据以及服务器通过Request请求获取数据

    C#中HttpWebRequest的用法详解 可参考: C#中HttpWebRequest的用法详解 C# HttpWebRequest详解 C# 服务器通过Request获取参数 可参考: C# WebService 接口 通过Request请求获取json参数 1、后台程序发送HTTP请求的Class,服务器端也要添加该类 2、服务端返回HTTP请求的数据class,客户端也要有 1、后台

    2024年02月06日
    浏览(53)
  • react通过axios发送请求并演示配置多个反向代理地址解决跨域

    这里 我们准备一个接口 我这里用java写了一个 然后 我们打开react项目 安装axios 然后在src下创建一个setupProxy.js 编写代码如下 可以看到 这里我们配了两个方向代理 如果请求的路中 包含api 就会代理成 http://localhost:8080/请求路径 如果包含user则会成为 http://localhost:808/请求路径 这

    2023年04月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包