手把手教你学会RabbitMQ(下)

简介: 前几天阿粉在看关于如何处理分布式事务的解决方案,于是就看到了关于使用最大努力通知来处理分布式事务的问题,而这其中最不可或缺的就是消息中间件了,那么什么是消息中间件呢?

4.RabbitMQ的使用

上一阶段,我们已经完全的把RabbitMQ进行了安装,接下来我们就要看他的使用了,来,继续找官网的文档。

63.jpg

大家看到了这个Java案例了么?来打开了瞅瞅,先把生产者和消费者确定一下,生产者Producer,消费者Consumer,生产者提供消息,然后把消息发送到消息队列,消费者监听到消息之后,对消息进行消费。

我们也手把手写一个,

Producer

private final static String QUEUE_NAME = "Test_queue";
    public static void main(String[] args) {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        try {
            Connection connection = factory.newConnection();
            Channel channel = connection.createChannel();
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Hello World";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
            System.out.println(" 我生产了一条消息 " + message );
        }catch (Exception e){
        }
    }
我生产了一条消息Hello World

这个时候,我们就能在后端的控制台上看到内容了,

64.jpg

看到了我们的total,还有Ready,证明我们发送消息已经成功了,现在已经有一条叫做“Hello World”的消息在我们的消息队列里面了。

65.jpg

既然作为生产者的我们,消息已经发送了,这时候是不是就得开始写个消费者了?来,我们再写一个最最基础的消费者

Consumer

ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        DeliverCallback deliverCallback = (consumerTag, deliver) -> {
            String message = new String(deliver.getBody(), "UTF-8");
            System.out.println(" 我是来消费消息的" + message );
        };
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
    }
我是来消费消息的'Hello World'


66.jpg

大家看,这是不是就把你刚才生产的消息给消费掉了呢?

实际上Demo就是这么简单,但是不能这么简单的去写,今天阿粉先来讲讲这个RabbitMQ里面的一些内容,之后再继续给大家整合一下SpringBoot,SpringCloud这些内容。

5.RabbitMQ的一些重点基础

5.1 Channel(通道)

多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,复用TCP连接的通道。

5.2 Queue(消息队列)

在这里阿粉就要给大家开始划重点了,Queue是RabbitMQ 的内部对象,用于存储消息。RabbitMQ中消息都只能存储在队列中,队列的特性是先进先出。

我们刚才也看到了图片,发送的消息都是在Queue中存储的,可以理解成一个存储数据的结构,我们把“Hello World”发送到Queue中,然后提供给消费者消费。

至于生产者Producer和消费者Consumer,阿粉肯定也不用说了,一个是生产消息,一个消费消息。

5.3 Exchange: 交换器

Exchange交换机扮演着接收生产者生产的消息的角色。同时Exchange交换机还需要将接收到的消息传递给queue队列进行存储或消费,不同类型的exchange配合着routing_key就能按照exchange类型对应的路有规则将消息传递到指定的某个或者某些queue队列。

说到交换器,那肯定就想到了路由,而在这里也是有这个名字的,不过不是单纯的路由,而是RoutingKey。

RoutingKey: 相当于一个路由键,一般是用来指定路由规则的。而他经常搭配和Binding(绑定键)一起使用。

生产者将消息发送给交换器时,需要一个RoutingKey,当BindingKey和 RoutingKey相匹配时,消息会被路由到对应的队列中。

Exchange分类:

  • Direct
  • Fanout
  • Topic
  • Headers

对于Direct类型的交换器,在接收到生产者发送的消息时会将消息路由给与该exchange绑定的且与该消息的routing_key同名的queue队列。如果exchange上未绑定与routing_key同名的queue,消息将会被抛弃。

对于Fanout类型的交换器,将接收到的消息路由投递到所有与其绑定的queue队列上,此种类型exchange消息路由与routing_key无关。

对于Topic类型的交换器,采用模糊匹配的方式,可以通过通配符满足一部分规则,这就和Direct不一样了,Direct是完全匹配BindingKey和RoutingKey。

对于Headers类型的交换器,不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的 headers 属性进行匹配.这时候我们需要在代码里面去设置Headers中的信息(键值对),对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果完全匹配则消息会路由到该队列,否则不会路由到该队列 。

他们这些也是各有特点,大家记住了么?到这里文章就告一段落了,接下来的文章会深入讲解一下怎么去配置这些交换器类型,还有整合SpringBoot,大家快去赶紧动手安装并且写个测试吧。

文章参考

《RabbitMQ官方文档》

《RabbitMQ入门》

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
6天前
|
消息中间件 存储 Kafka
01.RabbitMQ入门
01.RabbitMQ入门
25 0
|
2月前
|
消息中间件 Java
RabbitMQ笔记
RabbitMQ笔记
37 2
RabbitMQ笔记
|
2月前
|
消息中间件 监控 Linux
【RabbitMQ教程】第一章 —— RabbitMQ - 安装
【RabbitMQ教程】第一章 —— RabbitMQ - 安装
|
10月前
|
消息中间件 存储 网络协议
RabbitMQ 入门系列(一)
RabbitMQ 入门系列(一)
134 0
RabbitMQ 入门系列(一)
|
12月前
|
消息中间件 存储 监控
RabbitMQ:从入门到实践
1. RabbitMQ简介 RabbitMQ是一款开源的、基于AMQP协议的消息队列系统,用于构建可扩展、高性能、松耦合的分布式系统。RabbitMQ具有以下特点: 支持多种语言和平台:Java、Python、Ruby、.NET等 提供丰富的交换器类型和路由策略:直接、广播、主题和头 支持消息持久化和高可用性:保证消息不丢失,服务可用性 提供管理界面和监控插件:方便管理和监控RabbitMQ服务器 社区活跃,文档丰富:易于学习和使用
4710 2
RabbitMQ:从入门到实践
|
10月前
|
消息中间件 负载均衡
RabbitMQ 入门系列(二)
RabbitMQ 入门系列(二)
109 0
|
10月前
|
消息中间件 网络架构
RabbitMQ 入门系列(四)
RabbitMQ 入门系列(四)
54 0
|
10月前
|
消息中间件
RabbitMQ 入门系列(三)
RabbitMQ 入门系列(三)
98 0
|
消息中间件 存储 数据可视化
1、RabbitMQ教程-RabbitMQ简介
1、RabbitMQ教程-RabbitMQ简介
109 0
1、RabbitMQ教程-RabbitMQ简介
|
消息中间件 存储 缓存
RabbitMQ 实战教程(一)
RabbitMQ 实战教程(一)
193 0
RabbitMQ 实战教程(一)