RabbitMQ 使用

RabbitMQ 使用
摘要由CSDN通过智能技术生成

目录

简介

下载、安装

RabbitMQ原始API使用

生产者

消费者

基于SpringAMQP的API使用

simpleQueue简单队列

WorkQueue任务队列

发布(Publish)、订阅(Subscribe)

Fanout 广播(消息交给所有绑定到交换机的队列)

Direct定向(消息交给符合指定routing key 的队列)

Topic 通配饰

消息转换器

消息可靠性

生产者消息确认

消息持久化

 消费者消息确认

消费失败重试机制

消费者消费失败重试策略

死信交换机

TTL

延迟队列

安装DelayExchange插件

DelayExchange原理

使用DelayExchange

惰性队列

消息堆积问题

惰性队列

仲裁队列

code创建仲裁队列

SpringAMQP连接MQ集群


MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。

比较常见的MQ实现:

  • ActiveMQ

  • RabbitMQ

  • RocketMQ

  • Kafka

几种常见MQ的对比:

RabbitMQ ActiveMQ RocketMQ Kafka
公司/社区 Rabbit Apache 阿里 Apache
开发语言 Erlang Java Java Scala&Java
协议支持 AMQP,XMPP,SMTP,STOMP OpenWire,STOMP,REST,XMPP,AMQP 自定义协议 自定义协议
可用性 一般
单机吞吐量 一般 非常高
消息延迟 微秒级 毫秒级 毫秒级 毫秒以内
消息可靠性 一般 一般

追求可用性:Kafka、 RocketMQ 、RabbitMQ

追求可靠性:RabbitMQ、RocketMQ

追求吞吐能力:RocketMQ、Kafka

追求消息低延迟:RabbitMQ、Kafka

简介

RabbitMQ中的一些角色:

  • publisher:生产者

  • consumer:消费者

  • exchange:交换机,负责消息路由

  • queue:队列,存储消息

  • virtualHost:虚拟主机,隔离不同租户的exchange、queue、消息的隔离

最好是每一个用户拥有不同的virtualHost,这样就保证只能看到属于自己的虚拟主机下的exchange和queue。具有很好的隔离性

下载、安装

RabbitMQ 下载、安装_naki_bb的博客-CSDN博客

RabbitMQ原始API使用

依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.9.RELEASE</version>
        <relativePath/>
    </parent>

        <!--AMQP依赖,包含RabbitMQ-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <!--单元测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

生产者

 public static void main(String[] args) throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("192.168.168.128");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("root");
        factory.setPassword("root");
        // 1.2.建立连接
        Connection connection = factory.newConnection();

        // 2.创建通道Channel
        Channel channel = connection.createChannel();

        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.订阅消息
        channel.basicConsume(queueName, true, new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                // 5.处理消息
                String message = new String(body);
                System.out.println("接收到消息:【" + message + "】");
            }
        });
        System.out.println("等待接收消息。。。。");
    }

消费者

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("192.168.168.128");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("root");
        factory.setPassword("root");
        // 1.2.建立连接
        Connection connection = factory.newConnection();

        // 2.创建通道Channel
        Channel channel = connection.createChannel();

        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.订阅消息
        channel.basicConsume(queueName, true, new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                // 5.处理消息
                String message = new String(body);
                System.out.println("接收到消息:【" + message + "】");
            }
        });
        System.out.println("等待接收消息。。。。");
    }

注意设置VirtuaHost、username、password需要对应,可以在管理后台查询 或者 创建对应的用户和VirtuaHost。

也 可以在管理后台查看连接、channels, exchange, queue的其他信息。

基于SpringAMQP的API使用

SpringAMQP是基于AMQP协议定义的一套API规范,提供模板发送和接受消息,

其中spring-amqp是基础抽象,spring-rabbit是底层默认实现。

SpringAmqp的官方地址:Spring AMQP

SpringAMQP提供了三个功能:

  • 自动声明队列、交换机及其绑定关系

  • 基于注解的监听器模式,异步接收消息

  • 封装了RabbitTemplate工具,用于发送消息

simpleQueue简单队列

 simpleQueue没有exchange交换机,直接发往queue,消费一经被消息,就没有了。

依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.9.RELEASE</version>
        <relativePath/>
    </parent>

        <!--AMQP依赖,包含RabbitMQ-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <!--单元测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

配置

spring:
  rabbitmq:
    host: 192.168.168.128
    port: 5672
    username: root
    password: root
    virtual-host: /

生产者

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringRabbitMQPublisherTest {
    @Autowired
    RabbitTemplate rabbitTemplate;

    @Test
    public void simpleQueueSend(){
        String queueName = "simple.queue";
        String message = "hello, Spring amqp";
        rabbitTemplate.convertAndSend(queueName, message);
    }
}

消费者

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class RabbitMQListener {

    @RabbitListener(queues = "simple.queue")
    public void simpleQueueListener(String msg) {
        System.out.println("consumer 接受到了simpleQueue : " + msg);
    }
}

WorkQueue任务队列

Work queues,也被称为(Task queues),任务模型。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息

当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多,无法及时处理。

此时就可以使用work 模型,多个消费者共同处理消息处理,速度就能大大提高了。

生产者

和simpleQueue在生产者没有区别

    @Test
    public void workQueueSend() {
        String queueName = "simple.queue";
        String message = "hello, Spring amqp__";
        for (int i = 0; i < 50; i++) {
            rabbitTemplate.convertAndSend(queueName, message + i);
        }
    }

消费者

    @RabbitListener(queues = "simple.queue")
    public void workQueueListener1(String msg) throws InterruptedException {
        System.out.println("consumer1 接受到了simpleQueue : " + msg);
        Thread.sleep(20);
    }

    @RabbitListener(queues = "simple.queue")
    public void workQueueListener2(Str
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值