前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >原创 | Springboot整合RabbitMQ

原创 | Springboot整合RabbitMQ

作者头像
润森
发布2020-01-14 15:26:41
6450
发布2020-01-14 15:26:41
举报
文章被收录于专栏:毛利学Python

大家好,我是润森。期末已挂,又有时间写笔记。

MQ

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。

RabbitMQ

RabbitMQ是一个遵循AMQP协议的消息中间件,它从生产者接受消息并传递给消费者,在这和过程中,根据路由规则就行路由、缓存和持久化。

docker 搭建RabbitMQ

代码语言:javascript
复制
docker pull rabbitmq:management (镜像配有控制台)
# 创建容器
docker run -d -p 5672:5672 -p 15672;15672 --name myrabbitmq  rabbitmq:management

启动容器后,可以浏览器中访问http://localhost:15672来查看控制台信息。

RabbitMQ默认的用户名:guest,密码:guest

RabbitMQ概念和理解

RabbitMQ有几个重要的概念:虚拟主机,交换机,队列和绑定

  • 虚拟主机:一个虚拟主机持有一组交换机、队列和绑定,我们可以从虚拟主机层面的颗粒度进行权限控制
  • 交换机:Exchange用于转发消息,它并不存储消息,如果没有Queue队列绑定到Exchange,它会直接丢弃掉生产者发来的数据。
  • 交换机还有个关联的重要概念:路由键,消息转发到哪个队列根据路由键决定
  • 绑定:就是绑定交换机和队列,它是多对多的关系,也就是说多个交换机可以绑同一个队列,也可以一个交换机绑多个队列

交换机有四种类型的模式Direct, topic, Headers and Fanout

这是队列和交换器的关系图

这就是它们区别

fanout:把所有发送到该Exchange的消息投递到所有与它绑定的队列中。

direct:把消息投递到那些binding key与routing key完全匹配的队列中。

topic:将消息路由到binding key与routing key模式匹配的队列中。

系统架构

spring整合Rabbitmq

pom.xml引进spring-boot-starter-amqp

代码语言:javascript
复制
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
application.properties配置文件
代码语言:javascript
复制
spring.rabbitmq.host=ip
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

DemoRabbitmqApplicationTests测试类

使用的是单播原则

代码语言:javascript
复制
@SpringBootTest
class DemoRabbitmqApplicationTests {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @Autowired
    AmqpAdmin amqpAdmin;

    @Test
    void contextLoads() {
        //Message需要自己构造一个;定义消息体内容和消息头
        //rabbitTemplate.send(exchage,routeKey,message);

        //object默认当成消息体,只需要传入要发送的对象,自动序列化发送给rabbitmq;
        //rabbitTemplate.convertAndSend(exchage,routeKey,object);
        Map<String, Object> map = new HashMap<>();
        map.put("msg", "这是第一个消息");
        map.put("data", Arrays.asList("helloworld", 123, true));
        System.out.println(map.toString());
        rabbitTemplate.convertAndSend("exchange.direct", "atguigu.news", map);
        System.out.println("消息发送出去");
    }
    //接受数据,如何将数据自动的转为json发送出去
    @Test
    void receive() {
        Object o = rabbitTemplate.receiveAndConvert("atguigu.news");
        System.out.println(o.getClass());
        System.out.println(o);
    }

}

atguigu.news队列中查看对应的数据

如何将网页端的输出atguigu.news队列数据转化成json序列化,就要自定义MyAMQPConfig

在config文件夹中,新建MyAMQPConfig

代码语言:javascript
复制
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @author: 毛利
 */
@Configuration
public class MyAMQPConfig {
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}

messageConverter换为Jackson2JsonMessageConverter,再测试运行

spring传递Bean对象

传递Book对象到Rabbitmq

新建bean文件Book对象,一个bookName一个author类变量

ALT+INS补充tostring,Constructor有无参构造器,Getter和Setter

代码语言:javascript
复制
package com.example.demorabbitmq.Bean;

/**
 * @author: 毛利
 */
public class Book {
    private String bookName;
    private String author;

    public Book() {
    }

    public Book(String bookName, String author) {
        this.bookName = bookName;
        this.author = author;
    }

    public String getBookName() {
        return bookName;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bookName='" + bookName + '\'' +
                ", author='" + author + '\'' +
                '}';
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}

DemoRabbitmqApplicationTests测试类 rabbitTemplate.convertAndSend传递Book("西游记","吴承恩"))

代码语言:javascript
复制
@Test
void contextLoads() {
    //Message需要自己构造一个;定义消息体内容和消息头
    //rabbitTemplate.send(exchage,routeKey,message);

    //object默认当成消息体,只需要传入要发送的对象,自动序列化发送给rabbitmq;
    //rabbitTemplate.convertAndSend(exchage,routeKey,object);
    Map<String, Object> map = new HashMap<>();
    map.put("msg", "这是第一个消息");
    map.put("data", Arrays.asList("helloworld", 123, true));
//        System.out.println(map.toString());
    rabbitTemplate.convertAndSend("exchange.direct", "atguigu.news", new Book("西游记","吴承恩"));
    System.out.println("消息发送出去");
}

测试运行

补充广播fanout

Exchange之fanout交换器(广播)

代码语言:javascript
复制
 @Test
 public void sendMsg() {
     rabbitTemplate.convertAndSend("exchange.fanout", "", new Book("红楼梦", "曹雪芹"));
 }

总结

RabbitMQ 本文使用Docker搭建RabbitMQ,使用Springboot传递消息到RabbitMQ,通过自定义RabbitMQ,将消息改为json序列。希望以上对你学习有用

再自我介绍一下吧。我叫润森,是一个的学习者。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小刘IT教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MQ
  • RabbitMQ
  • docker 搭建RabbitMQ
  • RabbitMQ概念和理解
    • 这就是它们区别
      • 系统架构
      • spring整合Rabbitmq
      • spring传递Bean对象
        • 补充广播fanout
        • 总结
        相关产品与服务
        消息队列 CMQ 版
        消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档