1.简介

RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue protocol)的开源实现。AMQP高级消息队列,说白了就是一个开源的消息中间件。它能解决不同组件、模块、系统间消息通信。

2.系统架构

RabbitMQ Server: 也叫broker server,存储消息的地方

Producer:数据的发送方

Consumer:数据的接收方

Connection: 就是一个TCP的连接。Producer和Consumer都是通过TCP连接到RabbitMQ Server的。以后我们可以看到,程序的起始处就是建立这个TCP连接。

Channels: 虚拟连接。它建立在上述的TCP连接中。数据流动都是在Channel中进行的。也就是说,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel。

那么,为什么使用Channel,而不是直接使用TCP连接?

对于OS来说,建立和关闭TCP连接是有代价的,频繁的建立关闭TCP连接对于系统的性能有很大的影响,而且TCP的连接数也有限制,这也限制了系统处理高并发的能力。但是,在TCP连接中建立Channel是没有上述代价的。对于Producer或者Consumer来说,可以并发的使用多个Channel进行Publish或者Receive。

Message:消息。服务器和应用程序之间传递的数据,本质上就是一段数据,由Properties和Body组成。

Exchange:交换机。接收消息,根据路由键转发消息到绑定的队列。

Binding:Exchange和Queue之间的虚拟连接,binding中可以包含routing key。

Routing key:一个虚拟地址,虚拟机可用它来确定如何路由一个特定消息。

Queue:也称为Message Queue,消息队列,保存消息并将它们转发给消费者。

Virtual Host:其实是一个虚拟概念。类似于权限控制组,一个Virtual Host里面可以有若干个Exchange和Queue,可以用来隔离Exchange和Queue。,同一个Virtual Host里面不能有相同名称的Exchange和Queue。但是权限控制的最小粒度是Virtual Host。(下面会讲到)

3、图解

    1. 信息生产者将消息(message)发送到exchange

  2. exchange接受消息之后,负责将其路由到具体的队列中

  3. Bindings负责连接exchange和队列(queue)

  4. 消息到达队列(queue),然后等待被消息接收端处理

  5. 消息接收端处理消息

Exchanges有三种类型:direct, fanout,topic。 每个实现了不同的路由算法(routing algorithm)。

Direct exchange: 如果 routing key 匹配, 那么Message就会被传递到相应的queue中。其实在queue创建时,它会自动的以queue的名字作为routing key来绑定那个exchange。

Fanout exchange: 会向响应的queue广播。

Topic exchange: 对key进行模式匹配,比如ab*可以传递到所有ab*的queue。

Consumer和Procuder都可以通过 queue.declare 创建queue。如果queue已经存在,也不会报错。如果没有,要么发送不了消息,要么取不到消息,所以还是都创建吧。

Bindings就是将通过Exchange将queue和routing keys绑定。

总结:生产者将消息发送到Exchange交换机的,不是发送到Queue上的,生产者不知道消息是谁消费,有哪些消费者消费。Exchange根据一定的路由规则将消息转发到Queue。
消费者是监听队列的,不知道是哪个生产者发送的

4.具体代码

添加maven 依赖

<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>3.6.5</version></dependency>

消费者

package com.flying.rabbitmq.quickstart;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Consumer {public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {//创建connectionFactory 并进行配置ConnectionFactory connectionFactory=new ConnectionFactory();connectionFactory.setHost("127.0.0.1");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");//2.通过连接工厂创建连接Connection connection=connectionFactory.newConnection();//3.通过connection 创建一个channel 通道Channel channel=connection.createChannel();//4 声明(创建)一个队列String queueName = "test001";channel.queueDeclare(queueName,true,false,false,null);//5.声明一个消费者QueueingConsumer queueingConsumer=new QueueingConsumer(channel);//6.设置Channelchannel.basicConsume(queueName,true,queueingConsumer);while (true){//7.获取消息QueueingConsumer.Delivery delivery=queueingConsumer.nextDelivery();String msg=new String(delivery.getBody());System.err.println("消费端"+msg);}}
}

生产端

package com.flying.rabbitmq.quickstart;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Producer {public static void main(String[] args) throws IOException, TimeoutException {//创建connectionFactory 并进行配置ConnectionFactory connectionFactory=new ConnectionFactory();connectionFactory.setHost("127.0.0.1");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");//2.通过连接工厂创建连接Connection connection=connectionFactory.newConnection();//3.通过connection 创建一个channel 通道Channel channel=connection.createChannel();//4.通过Channel 发送数据for(int i=0; i < 5;i++){String msg="Hello rabbitmq";channel.basicPublish("","test001",null,msg.getBytes());}//5 记得要关闭相关的连接
        channel.close();connectionFactory.clone();}
}

运行结果

转载于:https://www.cnblogs.com/lflying/p/11107150.html

RabbitMQ 快速入门相关推荐

  1. RabbitMQ(一):RabbitMQ快速入门

    RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.作为一名合格的开发者,有必要对RabbitMQ有所了解,本文是RabbitMQ快速入门文章,主要内容包括Rab ...

  2. 【外行也能看懂的RabbitMQ系列(一)】—— RabbitMQ快速入门篇(内含丰富实例)

    系列文章目录 准备篇 RabbitMQ安装文档 第一章 RabbitMQ快速入门篇 第二章 RabbitMQ的Web管理界面详解 第三章 RabbitMQ进阶篇之死信队列 第四章 RabbitMQ进阶 ...

  3. MQ(二)RabbitMQ快速入门

    一.RabbitMQ 概述和安装 RabbitMQ 是基于 Erlang 语言开发的开源消息通信中间件 1. RabbitMQ的结构和概念 RabbitMQ中的几个概念: (1)channel:操作M ...

  4. RabbitMQ快速入门 | 帮助快速上手

    ♨️本篇文章记录的为RabbitMQ知识中快速入门相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬

  5. RabbitMQ快速入门--简单队列模型

    入门案例 简单队列模式的模型图: 官方的HelloWorld是基于最基础的消息队列模型来实现的,只包括三个角色: publisher:消息发布者,将消息发送到队列queue queue:消息队列,负责 ...

  6. 学成在线--11.RabbitMQ快速入门

    文章目录 一.RabbitMQ简介 二.相关知识 1.AMQP 2.JMS是什么 ? 三.RabbitMQ的工作原理 四.Hello World 1.创建Maven工程 2.生产者 3.消费者 五.总 ...

  7. RabbitMq详解+SpringBoot整合RabbitMq快速入门

    1概述: 1.1.什么是MQ 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已. 其主要用途:不同进程Pro ...

  8. RabbitMQ快速入门及实例演示

    RabbitMQ 先做起来,再去想其他. 1.MQ 消息队列概念 MQ(message queue)消息队列,FIFO先入先出.对服务器的请求先加入到消息队列中,再由消息队列来进行请求的分发. 还是一 ...

  9. RabbitMQ快速入门

    目录 1. 消息中间件概述 1.1. 什么是消息中间件 1.2. AMQP 和 JMS 1.2.1. AMQP 1.2.2. JMS 1.2.3. AMQP 与 JMS 区别 1.3. 消息队列产品 ...

最新文章

  1. 「每周CV论文推荐」 初学深度学习人脸识别和验证必读文章
  2. MATLAB R2022 最新中英文版 数据处理
  3. GameMaker Studio 中的组合技(Combo)设置
  4. Oracle中实现continue的方法
  5. 新加入“扫码阅读”功能
  6. 【ZOJ - 4032】Magic Points (思维,几何,构造)
  7. C# winform post 请求指定 url
  8. eclipse中html设置,无法在eclipse中设置HTMLUNIT
  9. 重新想象 Windows 8 Store Apps (23) - 文件系统: 文本的读写, 二进制的读写, 流的读写, 最近访问列表和未来访问列表...
  10. 网上订餐系统python程序代码_网上订餐系统源代码
  11. Butterworth滤波
  12. 精练战略云 VS “华丽“战术云
  13. WSA无法调用GPU跑分解决方法
  14. QT学习(六)——Lamda表达式的使用
  15. KBEngine warring项目源码阅读(三) 实体文件与Account处理
  16. relative会脱离文档流吗_脱离文档流和恢复文档流的方法
  17. 编译原理chatpter04 文法的形式和文法的类型
  18. solo 电路 耳放_SOLO耳放分析,带PCB布线
  19. 基于java(springboot框架)的购物商城系统 毕业论文
  20. 【译】CSS 十六进制颜色揭秘

热门文章

  1. mysql更新一个表里的字段等于另一个表某字段的值
  2. 分布式缓存之Memcache
  3. 博客搬迁至网易博客 http://happyboy200032.blog.163.com
  4. ScottGu之博客翻译-LINQ to SQL第三部分,查询数据库 (Part 3 - Querying our Database)
  5. [Rtsp]RTSP对实时摄像头视频流进行转换(FFmpeg+FFserver)
  6. Bean的id、name、ref、refid
  7. 【前端大概一分钟】css隐藏滚动条同时可以滚动
  8. 玩转Excel系列-SUMIFS函数使用及实例
  9. OpenStack Austin 峰会观察:OpenStack as IaaS 已是过去,Solutions on OpenStack 才是未来
  10. The RSpec Book笔记《一》初步认识TDD,BDD,RSpec,Cucumber