注:本文章基于尚硅谷Springboot高级特性相关视频及资料进行编写,代码简单,较容易理解,若有问题或者源码资料获取欢迎在评论区留言或者联系作者!

消息初解

大多应用中,可以通过消息服务中间件来提升系统异步通信,扩展解耦能力

消息服务中两个重要概念:
消息代理(服务器)和目的地

当消息发送者发送信息之后,将由信息代理接管,消息道理保证信息传递到指定目的地;

消息队列主要有两种目的地形式:

  • 队列:点对点消息通信
    • 消息发送者发送信息,消息代理将其放入一个队列中,消息接受者从队列中获取消息内容。消息读取后被移出队列
    • 消息只有唯一的发送者或接受者,但并不是说只能有一个接受者
  • 主题:发布/订阅消息通信
    • 发送者发布消息到主题,多个接受者监听(订阅)这个主题,那么就会在消息到达的同时收到消息
  • JMS java消息服务
  • AMQP:高级消息队列协议,也是一个消息代理规范,兼容JMS(RabbitMQ是AMQP的实现)

@JmsListenner、@RabbitListener注解方法上监听消息代理发布的消息
@EnableJms,@EnableRabbit开启支持

RabbitMQ初始环境配置:

(1)首先需要安装RabbitMQ,这里我们采用的是在Windows系统下进行安装,安装方法可以参考本人的另一篇文章【RabbitMQ】手把手教你windows环境下安装RabbitMQ及错误解决

(2)安装完成后,使用http://localhost:15672 访问RabbitMQ的web管理页面,创建三个常用的交换器(exchange.fanout,exchange.direct,exchange.toppic);
Exchange–>add a new exchange如下图所示
在这里插入图片描述
在这里插入图片描述
(3)添加队列,Queue–>add a new queue,添加如下图的四个队列
在这里插入图片描述
(4)将所有队列和所有路由分别进行绑定
在这里插入图片描述
前面exchange.direct和exchange.fanout的绑定都是一样的,这里要注意ticop的绑定,RoutingKey如下图所示,按照下图进行绑定;
在这里插入图片描述
(4)模拟发送信息,Exchange->Publish message中设置好相应的参数,RoutingKey设置为pojo123,如下图所示,然后对数据进行发送
在这里插入图片描述
结果如下,可以看到pojo123队列收到了该信息:
在这里插入图片描述

创建工程整合RabbitMQ

(1)引入依赖文件

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <scope>test</scope>
        </dependency>

查看引入的自动配置:

		 **1. RabbitAutoConfifuration (自动配置类)
		 2. 有自动配置了连接工厂 ConnectionFactory;
		 3. RabbitProperties封装了Rabbit的自动配置
		 4. RabbitTemplate:给RabbitMQ发送和接受消息
		 5. AmqAdmin:RabbitMQ系统管理功能组件
		      AmqAdmin:创建和删除Queue(消息队列),Exchange(交换器),Binding(绑定规则)
		 7. @EnableRabbit+@RabbitListenner 监听消息队列内容**

(2)编写发送信息测试文件,

这里使用提供的rabbitTemplate进行消息的转换和发送

@Test
    void contextLoads() {
        //Messag需要自己构造一个;定义消息体内容和消息头


        //object默认当成消息体,只需要传入要发送的对象,自动序列给rabbitmq
//        rabbitTemplate.convertAndSend(exchage,routekey,object);
        HashMap<String, Object> map = new HashMap<>();
        map.put("msg","这是第一个消息");
        map.put("data", Arrays.asList("hello",123,true));

        rabbitTemplate.convertAndSend("exchange.direct","pojo123.news",map);

    }

运行后可以发现pojo123队列中多了这个数据,但是会发现和之前的缓存一样,序列化出现问题,但是证明数据传输没有问题,后面我们将会对这个问题得到解决;
在这里插入图片描述

(3)编写测取信息测试文件:

这里编写测试文件获取pojo123.news队列中的数据并进行转换,可以发现能够正常 获取和转化;

 @Test
    void receive(){
         Object o = rabbitTemplate.receiveAndConvert("pojo123.news");
         System.out.println(o.getClass());
         System.out.println(o);
     }

运行结果:
在这里插入图片描述

(4)加入序列化机制

编写配置类,使用jackson2json的消息转换机制

@Configuration
public class MyAMQPConfig {

    @Bean
    public MessageConverter messageConverter(){

        return  new Jackson2JsonMessageConverter();

    }
}

在此运行发送信息测试文件,可以发现数据能够正常显示,编写序列化配置文件成功
在这里插入图片描述

后面传入和获取实体类也可以,可以自行测试

(5)测试使用监听机制:

使用开发中常用@RabbitListener注解监听指定名称队列的消息情况,这种方式会在监听到指定队列存在消息后立即进行消费处理。

首先编写service类,当监听到pojo123.news队列中含有数据消息时,就会获取消息并输出;然后在启动类上加入@EnableRabbit注解,启动Rabbit监听机制;

@Service
public class QueuesListennerService {

    @RabbitListener(queues = "pojo123.news")
    public void receive(String str){
        System.out.println("收到消息"+str);
    }
}

运行结果如下图,说明能够正常监听
在这里插入图片描述

总结

本内容主要针对Springboot与RabbitMQ消息中间件的整合进行了叙述和讲解,后面还有使用Amqadmin分别对队列,交换器,绑定进行创建修改等操作的内容,较为简单,可以在上面的基础上进行后续的学习,这里将不再进行叙述;
在这里插入图片描述