RabbitMQ传送-接收对象
- JSON字符串发送-接收对象
- 对象序列化发送-接收对象
一、消息提供者发送消息
- 创建项目producer
引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
- application.yml配置文件
server:
port: 9002
spring:
application:
name: consumer
#配置rabbitmq
rabbitmq:
host: 你的ip地址
port: 5672
virtual-host: host1
username: zhangsan
password: 123
- goods实体类、goods-add.html、GoodsController.java
Goods.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Goods implements Serializable {
private Integer id;
private String name;
private Float price;
private String desc;
}
goods-add.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>商品添加</title>
</head>
<body>
<h3>商品添加</h3>
<!-- 注意,form表单的name属性,要与实体类中的属性一致 -->
<form action="../goods/add" method="post">
<p>商品ID:<input type="number" name="id" value=""></p>
<p>商品Name:<input type="text" name="name" value=""></p>
<p>商品Price:<input type="text" name="price" value=""></p>
<p>商品Desc:<input type="text" name="desc" value=""></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
GoodsController.java
@Controller
@RequestMapping("/goods")
public class GoodsController {
@Autowired
private MQService mqService;
@RequestMapping("/add")
public String add(Goods goods) throws JsonProcessingException {
System.out.println("向queue1队列加入了消息对象===>" + goods);
//完成了商品添加操作
//将商品对象通过消息队列传递给consumer
mqService.sendMsg(goods);
//再返回到添加商品页面
return "goods-add";
}
}
MQService.java
发送对象有两种方式实现:
-
对象序列化实现(需对实体类实现序列化)
@Service /** * 消息队列只可以发送字符串、字节数组、序列号对象 */ public class MQService { @Autowired private AmqpTemplate amqpTemplate; public void sendMsg(Goods goods) throws JsonProcessingException { //1.直接传序列化的对象 amqpTemplate.convertAndSend("","queue1", message); //2.转换为字节数组传送 //byte[] bytes = SerializationUtils.serialize(goods); //amqpTemplate.convertAndSend("","queue1", bytes); } }
-
JSON字符串实现
@Service /** * 消息队列只可以发送字符串、字节数组、序列号对象 */ public class MQService { @Autowired private AmqpTemplate amqpTemplate; public void sendMsg(Goods goods) throws JsonProcessingException { //JSON字符串实现 //ObjectMapper:将对象内容转化为json对象使用 //把goods对象转换位json然后发送到queue1队列 ObjectMapper mapper = new ObjectMapper(); String message = mapper.writeValueAsString(goods); } }
- 此时运行消息提供者项目,发送消息到消息队列。
http://localhost:9001/goods/add //填写表单信息,即为对象赋值
然后发送。
二、消息消费者接收消息
- 创建项目consumer
- 配置文件application.yml
server:
port: 9002
spring:
application:
name: consumer
#配置rabbitmq
rabbitmq:
host: 你的ip
port: 5672
virtual-host: host1
username: zhangsan
password: 123
- 实体类、消息接收者类
实体类:Goods.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Goods implements Serializable {
private Integer id;
private String name;
private Float price;
private String desc;
}
ReceiveService.java
接收对象也对应有两种方式实现:
-
对象序列化接收(需对实体类实现序列化)
@Service @RabbitListener(queues = "queue1") public class ReviceMsgService { @RabbitHandler public void receiveMsg(byte[] good) { Goods goods = (Goods) SerializationUtils.deserialize(good); System.out.println(goods); } }
-
JSON字符串接收
@Service @RabbitListener(queues = "queue1") public class ReviceMsgService { @RabbitHandler public void receiveMsg(String msg) throws JsonProcessingException { //JSON字符串接收 //mapper.readValue:将序列化对象内容转为Goods对象 //把goods对象转换位json然后发送到queue1队列 ObjectMapper mapper = new ObjectMapper(); Goods goods = mapper.readValue(msg, Goods.class); System.out.println(goods); } }
- 此时运行consumer项目,即可实时接收队列中的对象信息。