RabbitMQ学习-Eight

一、使用RabbitMQ传递对象的步骤

  1. 准备对象 :

    首先,我们需要有一个要传递的对象。在这个例子中,我们假设有一个名为Goods的类,它包含了一些属性。

  2. 序列化对象 :

    RabbitMQ本身不支持直接传递对象,因此我们需要将对象序列化为字符串或字节数组。这通常可以通过Java的序列化机制或其他第三方库来实现。但RabbitMQ提供了更简单的方式,即使用AmqpTemplate的convertAndSend方法,该方法会自动处理对象的序列化。

  3. 配置消息提供者 :

    消息提供者是一个负责发送消息到RabbitMQ的服务。我们需要使用@Service注解来标记这个服务,并使用@Resource注解来注入AmqpTemplate对象。然后,我们可以编写一个方法来发送消息,该方法接收一个Goods对象作为参数,并使用amqpTemplate.convertAndSend方法将其发送到指定的队列中。

    示例代码:

    @Service
    public class MQService {
    @Resource
    private AmqpTemplate amqpTemplate;
    //如果对象未序列化,就会报错

    复制代码
     public void sendGoodsToMq(Goods goods) {
         // 消息队列可以发送字符串、字节数组、序列化对象
         amqpTemplate.convertAndSend("", "queue1", goods);
     }

    }

4.配置消息消费者 :

消息消费者是一个负责从RabbitMQ接收消息的服务。我们需要使用@Component注解来标记这个服务,并使用@RabbitListener注解来指定要监听的队列。然后,我们可以编写一个方法来处理接收到的消息,该方法接收一个Goods对象作为参数(由于使用了AmqpTemplate的自动序列化/反序列化功能,这里可以直接接收Goods对象)。

示例代码:

复制代码
@Component
@RabbitListener(queues = "queue1")
public class ReceiveService {
    @RabbitHandler
    public void receiveMsg(Goods goods) {
        System.out.println("Goods---" + goods);
    }
}

注意事项

  • 包名、类名、属性名一致性:在传递序列化对象时,必须确保发送方和接收方的对象的包名、类名、属性名完全一致,否则会导致反序列化失败。
  • 消息队列名称:在发送和接收消息时,需要指定相同的消息队列名称。
  • 异常处理:在实际应用中,应该添加适当的异常处理逻辑,以处理可能的序列化/反序列化错误或其他通信问题。

二、使用RabbitMQ通过序列化字节数组传递对象

1. 创建消息提供者

首先,我们需要创建一个名为MQService的服务类,并将其标记为@Service,以便Spring能够自动扫描并管理它。在这个类中,我们将注入AmqpTemplate对象,它是Spring AMQP提供的用于发送和接收消息的模板类。

复制代码
@Service
public class MQService {
    @Resource
    private AmqpTemplate amqpTemplate;

    public void sendGoodsToMq(Goods goods) {
        // 将Goods对象序列化为字节数组
        byte[] bytes = SerializationUtils.serialize(goods);
        // 发送字节数组到RabbitMQ的queue1队列
        amqpTemplate.convertAndSend("", "queue1", bytes);
    }
}

注意: 虽然这里使用了convertAndSend方法,但由于我们直接传递了字节数组,所以实际上并没有利用到该方法的自动序列化功能。这里的convertAndSend只是将字节数组作为消息体发送出去。

2. 创建消息消费者

接下来,我们需要创建一个名为ReceiveService的服务类,并将其标记为@Component,以便Spring能够自动扫描并管理它。在这个类中,我们将使用@RabbitListener注解来监听RabbitMQ的queue1队列。当接收到消息时,我们将使用SerializationUtils.deserialize方法将字节数组反序列化为Goods对象。

复制代码
@Component
@RabbitListener(queues = "queue1")
public class ReceiveService {
    @RabbitHandler
    public void receiveMsg(byte[] bs) {
        // 将字节数组反序列化为Goods对象
        Goods goods = (Goods) SerializationUtils.deserialize(bs);
        // 打印Goods对象
        System.out.println("Goods: " + goods);
    }
}
相关推荐
一隅论数智4 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
XiHongShi20164 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
爱吃苹果的日记本4 天前
离散数学第六课
学习·离散数学
AI职业加油站4 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
旖旎夜光5 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
奇思妙想聪明勤奋的小羊5 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
霍霍的袁5 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
彧azz5 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
我爱cope5 天前
【操作系统 | 计算机硬件:CPU、内存与 I/O 如何支撑操作系统?】
学习·操作系统