RabbitMQ传送-接收对象

RabbitMQ传送-接收对象

  • JSON字符串发送-接收对象
  • 对象序列化发送-接收对象
一、消息提供者发送消息
  1. 创建项目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>
  1. application.yml配置文件
server:
  port: 9002

spring:
  application:
    name: consumer
  #配置rabbitmq
  rabbitmq:
    host: 你的ip地址
    port: 5672
    virtual-host: host1
    username: zhangsan
    password: 123
  1. 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);
            
        }
    }
    
  1. 此时运行消息提供者项目,发送消息到消息队列。
http://localhost:9001/goods/add  //填写表单信息,即为对象赋值

然后发送。


二、消息消费者接收消息
  1. 创建项目consumer

请添加图片描述

  1. 配置文件application.yml
server:
  port: 9002

spring:
  application:
    name: consumer
  #配置rabbitmq
  rabbitmq:
    host: 你的ip
    port: 5672
    virtual-host: host1
    username: zhangsan
    password: 123
  1. 实体类、消息接收者类

实体类: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);
        }
    }
    
  1. 此时运行consumer项目,即可实时接收队列中的对象信息。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值