一、使用RabbitMQ传递对象的步骤
-
准备对象 :
首先,我们需要有一个要传递的对象。在这个例子中,我们假设有一个名为
Goods
的类,它包含了一些属性。 -
序列化对象 :
RabbitMQ本身不支持直接传递对象,因此我们需要将对象序列化为字符串或字节数组。这通常可以通过Java的序列化机制或其他第三方库来实现。但RabbitMQ提供了更简单的方式,即使用
AmqpTemplate
的convertAndSend
方法,该方法会自动处理对象的序列化。 -
配置消息提供者 :
消息提供者是一个负责发送消息到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);
}
}