RabbitMQ 的基本使用

简单介绍

什么是MQ?
MQ 是Message Queue的缩写,也就是消息队列的意思。

MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。一般用来解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。

它最主要的三个特点:

  1. 消峰
  2. 解耦
  3. 异步

消息队列是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。


AMQP 与 JMS

MQ主流的实现方式有两种:AMQP 和 JMS

AMQP 是一个提供统一消息服务的应用层标准高级消息队列协议
JMS 是 java 中一个api,它为java提供了统一的消息操作,它jdbc比较类似

它俩之间的联系与却别:

  • JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式
  • JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的
  • JMS规定了两种消息模型;而AMQP的消息模型更加丰富

常见的消息队列:

  • ActiveMQ:基于JMS
  • RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好
  • RocketMQ:基于JMS,阿里巴巴产品,目前交由Apache基金会
  • Kafka:分布式消息系统,高吞吐量

图解关系

一张图送给大家:
在这里插入图片描述
在这里插入图片描述

之前的写过 RabbitMQ以及它Web端图形化界面的安装 ,大家可以根据图像化界面去了解一下RabbitMQ中Virtual Host 、 Exchange 、 Queue 、 Channel 之间的关系。


引入基本依赖

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

配置文件

使用yml类型的配置文件

spring:
  rabbitmq:
    host: 39.97.12.34 ## ip
    username: eric
    password: eric
    virtual-host: rabbitmq # 指定虚拟机
    template:
      exchange: lk.item.exchange # 指定默认交换机
    publisher-confirms: true  # 如果消息发送失败,会有ack,触发重试机制

消息提供者

// springboot用于测试的两个注解
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MQApplication.class)
public class SpringSenderTest {
	// 自动注入 AmqpTemplate
    @Autowired
    private AmqpTemplate amqpTemplate;

    @Test
    public void testSend() throws InterruptedException {
        String msg = "hello, Spring boot amqp";
        // 第一个参数: 指定发送的交换机
        // 第二个参数: 指定RoutingKey
        // 第三个参数: 指定发送的消息
        this.amqpTemplate.convertAndSend("spring.test.exchange","a.b", msg);
        // 等待10秒后再结束
        Thread.sleep(10000);
    }
}

在图形化界面中的交换机
在这里插入图片描述


消息的监听者

@Component
public class Listener {
    @RabbitListener(bindings = @QueueBinding(
    		// 设置选择队列名称
            value = @Queue(value = "spring.test.queue",durable = "true"),
            exchange = @Exchange(
                    value = "spring.test.exchange", // 选择交换机的名称
                    ignoreDeclarationExceptions = "true", // 消息持久化
                    type = ExchangeTypes.TOPIC // 选择可用topic的交换机
            ),
            // 指定 routingKey,使用通配符,直接匹配上边的 a.b
            key = {"#.#"}))
    // 参数类型,应与消息发送者发送消息类型保持一致
    public void recv(String msg){
        System.out.println(msg);
    }

简做总结,如有不足,欢迎指出!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章