SpringBoot整合RabbitMQ

文章目录

  • 一、RabbitMQ的安装
    • 1.安装
    • 2.检测
    • 3.测试
      • (1)创建需要的交换器
      • (2)添加消息队列
      • (3)消息队列与交换器的绑定
      • 发送消息
        • (1)direct交换器(点对点)
        • (2)fanout交换器(广播)
        • (3)topic(有选择的广播)
  • 二、RabbitMQ的整合
    • 创建一个SpringBoot项目
    • 了解RabbitMQ自动配置
    • 使用RabbitTemplate发送消息
      • 用到的方法
        • (1)需要自定义消息
        • (2)直接用对象序列化成消息
        • (3)单播(direct)发送(点对点式)
        • (4)接收数据
        • (5)测试广播(fanout)
        • (6)测试topic
    • @RabbitListener、@EnableRabbit
      • 不需要得到消息头
      • 需要得到消息头
    • AmqpAdmin管理组件的使用
      • 测试AmqpAdmin管理组件的使用


源码


一、RabbitMQ的安装

1.安装

  • 连接上linux服务器

  • 输入 docker images查看是否安装
    85d13aed3d43205edc1b161f96c2dc5f.png
    可以看到是没有安装rabbitMQ的

  • 输入docker pull rabbitmq:3.6-management
    management是带web管理页面的
    SpringBoot整合RabbitMQ_第1张图片

  • 输入docker images检查是否有镜像
    54d2605bbbb4f6d9f91696e7516f1ecf.png
    可以看到已经安装完成

  • 运行RabbitMQ,docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq 9df8e9792ce6
    aa2664c98fa2a671d07e24ab042ec391.png

第一个-p是客户端与RabbitMQ通信的端口
第二个-p是管理界面访问web界面的端口

  • 输入docker ps
    ca2a3fa2028ac38144bf38c5a7a1a873.png
    可以看到RabbitMQ已经在后台运行

2.检测

  • 输入systemctl stop firewalld.service关闭防火墙

  • 如果是阿里云的服务器,需要开放端口
    SpringBoot整合RabbitMQ_第2张图片

  • 在浏览器中输入服务器的ip地址:15672
    用户名和密码都是默人的guest
    SpringBoot整合RabbitMQ_第3张图片

3.测试

(1)创建需要的交换器

  • 在RabbitMQ管理界面操作
    SpringBoot整合RabbitMQ_第4张图片

  • 添加如下三个交换器
    SpringBoot整合RabbitMQ_第5张图片

(2)添加消息队列

SpringBoot整合RabbitMQ_第6张图片

(3)消息队列与交换器的绑定

  • 绑定关系

  • 消息队列要想起作用就要和交换器绑定

  • 在Exchanges中点击需要绑定的交换器

  • 点击Bindings进行绑定
    SpringBoot整合RabbitMQ_第7张图片

  • 如图所示:每个交换器都要绑定所有的消息队列
    SpringBoot整合RabbitMQ_第8张图片

  • exchange.topic的绑定规则如下:
    SpringBoot整合RabbitMQ_第9张图片

发送消息

(1)direct交换器(点对点)

  • 点开exchange.direct

  • 在下面发送消息
    SpringBoot整合RabbitMQ_第10张图片

  • 因为direct(点对点)交换器是完全匹配路由键的,所以只有一个队列可以收到
    SpringBoot整合RabbitMQ_第11张图片

(2)fanout交换器(广播)

  • 点开exchange.fanout
  • 发送消息
    SpringBoot整合RabbitMQ_第12张图片
    SpringBoot整合RabbitMQ_第13张图片
    可以看到都收到了消息,fanout是广播的(不管路由键是什么,全都发过去)

(3)topic(有选择的广播)

  • 点开exchange.fanout
  • 发送以下消息
    SpringBoot整合RabbitMQ_第14张图片

SpringBoot整合RabbitMQ_第15张图片
可以看到*.news匹配规则的都消息数量都增加了1,所以topic是有选择的广播

二、RabbitMQ的整合

创建一个SpringBoot项目

  • 使用SpringBoot的初始化向导创建一个项目
    SpringBoot整合RabbitMQ_第16张图片
    SpringBoot整合RabbitMQ_第17张图片

了解RabbitMQ自动配置

  • 自动配置类(RabbitAutoConfiguration)
  • 1、CachingConnectionFactory:;连接工厂
  • 2、RabbitProperties: 封装了RabbitMQ的所有配置
  • 3、RabbitTemplate:给RabbitMQ发送和接收消息
  • 4、AmqpAdmin:RabbitMQ的系统管理组件

使用RabbitTemplate发送消息

用到的方法

(1)需要自定义消息

/*Message需要自己构造一个;定制消息体内容和消息头*/
        rabbitTemplate.send(exchange,routeKey,message);

(2)直接用对象序列化成消息

  /*object默认当成消息体,只需要传入要发送的对象,自动序列化发送给rabbitmq*/
        rabbitTemplate.convertAndSend(exchange,routeKey,object);

(3)单播(direct)发送(点对点式)

  • 在测试类中输入以下代码:
@Test
    public void test01(){
        Map map = new HashMap();
        map.put("msg","这是第一个消息");
        map.put("data", Arrays.asList("helloworld",123,true));
        rabbitTemplate.convertAndSend("exchange.direct","atdanqing.news",map);
    }
  • 运行这个测试类,登录的web的管理界面,可以看到新增了一条消息
    SpringBoot整合RabbitMQ_第18张图片
    SpringBoot整合RabbitMQ_第19张图片
    这些字节码是通过默认的java序列化后的样子,不直观,我们希望用json的序列化形式展现出来

  • 如何将数据转化为json呢???

  • 在与主程序相同的路径下创建config包,在该包下创建MyAMQPConfig类

  • 在该类添加代码如下:

@Configuration
public class MyAMQPConfig {
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}
  • 运行上面的测试类,同样的方法看数据是否为json数据
    SpringBoot整合RabbitMQ_第20张图片

(4)接收数据

  • 在测试类写如下代码:
@Test
    public void receive(){
        Object o = rabbitTemplate.receiveAndConvert("atdanqing.news");
        System.out.println(o.getClass());
        System.out.println(o);
    }

SpringBoot整合RabbitMQ_第21张图片
可以看到封装的HashMap数据,当我们取出这个数据时,队列当中就会失去这个消息

(5)测试广播(fanout)

  • 在主程序相同的目录下创建bean包,在该包下创建Book类
public class Book {
    private String bookName;
    private String author;

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

    public Book() {
    }

    public String getBookName() {
        return bookName;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
    @Override
    public String toString() {
        return "Book{" +
                "bookName='" + bookName + '\'' +
                ", author='" + author + '\'' +
                '}';
    }
}
  • 在测试类中写测试广播的方法
@Test
    public void test02(){
        rabbitTemplate.convertAndSend("exchange.fanout","",new Book("三国演义","施耐庵"));
    }

三个消息队列都会收到消息

(6)测试topic

只需要指定相应的路由键就可以了,和上面的类似,这里略过了

@RabbitListener、@EnableRabbit

不需要得到消息头

  • 在与主程序相同的目录下创建一个service包,在该包下创建一个BookService类
@Service
public class BookService {

    @RabbitListener(queues = "atdanqing.news")//指定监听那一个消息队列
    public void receive(Book book){
        System.out.println("收到消息"+book);
    }
}
  • 要想让@RabbitListener起作用,必须要@EnableRabbit支持

  • 在主程序上加上@EnableRabbit注解
    SpringBoot整合RabbitMQ_第22张图片

  • 启动项目,清除控制台

  • 在测试类中再写一个方法运行

@Test
    public void test03(){
        rabbitTemplate.convertAndSend("exchange.fanout","",new Book("西游记","吴承恩"));
    }

切换到主程序的控制台可以看到
SpringBoot整合RabbitMQ_第23张图片
已经监听到了消息

需要得到消息头

这样得到的消息是没有消息头的,如果想要得到消息头用下面的方法

  • 在BookService类里添加如下方法:
    @RabbitListener(queues = "atdanqing")//指定监听那一个消息队列
    public void receive02(Message message){
        System.out.println(message.getBody());
        System.out.println(message.getMessageProperties());
    }

启动项目如果atdanqing消息队列里有消息就可以看到如图类似的形式,没有的话可以添加几个消息。
8971ebb142ec6244eec8d7c7c0c59f51.png

AmqpAdmin管理组件的使用

上面的这些操作都是因为Exchange和Queue都已经创建好了,如果没有创建好就需要在程序中用AmqpAdmin组件去创建。
AmqpAdmin的作用:创建和删除Quence,Exchange

测试AmqpAdmin管理组件的使用

  • 在测试类中添加以下代码
    @Autowired
    AmqpAdmin amqpAdmin;

    @Test
    public void createExchange(){
        amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));
        System.out.println("创建完成!!!");
    }
  • 运行项目,在web端查看是否创建成功
    SpringBoot整合RabbitMQ_第24张图片
    可以看到创建成功

  • 注释掉上面创建exchange的部分,添加是创建

amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));
  • 运行测试类,查看消息队列是否创建成功
    SpringBoot整合RabbitMQ_第25张图片
    可以看到创建成功

  • 创建绑定规则

  • 在测试类上注释掉上面的内容

amqpAdmin.declareBinding(new Binding("amqpadmin.queue",Binding.DestinationType.QUEUE,"amqpadmin.exchange","amqp.haha",null));
  • 运行测试类
    SpringBoot整合RabbitMQ_第26张图片
    可以看到绑定上了

你可能感兴趣的:(SpringBoot)