• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

RabbitMQ传送-接收对象

武飞扬头像
啃瓜子的松鼠
帮助1

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项目,即可实时接收队列中的对象信息。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggjhae
系列文章
更多 icon
同类精品
更多 icon
继续加载