RabbitMQ 快速入门
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 快速入门相关推荐
- RabbitMQ(一):RabbitMQ快速入门
RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.作为一名合格的开发者,有必要对RabbitMQ有所了解,本文是RabbitMQ快速入门文章,主要内容包括Rab ...
- 【外行也能看懂的RabbitMQ系列(一)】—— RabbitMQ快速入门篇(内含丰富实例)
系列文章目录 准备篇 RabbitMQ安装文档 第一章 RabbitMQ快速入门篇 第二章 RabbitMQ的Web管理界面详解 第三章 RabbitMQ进阶篇之死信队列 第四章 RabbitMQ进阶 ...
- MQ(二)RabbitMQ快速入门
一.RabbitMQ 概述和安装 RabbitMQ 是基于 Erlang 语言开发的开源消息通信中间件 1. RabbitMQ的结构和概念 RabbitMQ中的几个概念: (1)channel:操作M ...
- RabbitMQ快速入门 | 帮助快速上手
♨️本篇文章记录的为RabbitMQ知识中快速入门相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬
- RabbitMQ快速入门--简单队列模型
入门案例 简单队列模式的模型图: 官方的HelloWorld是基于最基础的消息队列模型来实现的,只包括三个角色: publisher:消息发布者,将消息发送到队列queue queue:消息队列,负责 ...
- 学成在线--11.RabbitMQ快速入门
文章目录 一.RabbitMQ简介 二.相关知识 1.AMQP 2.JMS是什么 ? 三.RabbitMQ的工作原理 四.Hello World 1.创建Maven工程 2.生产者 3.消费者 五.总 ...
- RabbitMq详解+SpringBoot整合RabbitMq快速入门
1概述: 1.1.什么是MQ 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已. 其主要用途:不同进程Pro ...
- RabbitMQ快速入门及实例演示
RabbitMQ 先做起来,再去想其他. 1.MQ 消息队列概念 MQ(message queue)消息队列,FIFO先入先出.对服务器的请求先加入到消息队列中,再由消息队列来进行请求的分发. 还是一 ...
- RabbitMQ快速入门
目录 1. 消息中间件概述 1.1. 什么是消息中间件 1.2. AMQP 和 JMS 1.2.1. AMQP 1.2.2. JMS 1.2.3. AMQP 与 JMS 区别 1.3. 消息队列产品 ...
最新文章
- 「每周CV论文推荐」 初学深度学习人脸识别和验证必读文章
- MATLAB R2022 最新中英文版 数据处理
- GameMaker Studio 中的组合技(Combo)设置
- Oracle中实现continue的方法
- 新加入“扫码阅读”功能
- 【ZOJ - 4032】Magic Points (思维,几何,构造)
- C# winform post 请求指定 url
- eclipse中html设置,无法在eclipse中设置HTMLUNIT
- 重新想象 Windows 8 Store Apps (23) - 文件系统: 文本的读写, 二进制的读写, 流的读写, 最近访问列表和未来访问列表...
- 网上订餐系统python程序代码_网上订餐系统源代码
- Butterworth滤波
- 精练战略云 VS “华丽“战术云
- WSA无法调用GPU跑分解决方法
- QT学习(六)——Lamda表达式的使用
- KBEngine warring项目源码阅读(三) 实体文件与Account处理
- relative会脱离文档流吗_脱离文档流和恢复文档流的方法
- 编译原理chatpter04 文法的形式和文法的类型
- solo 电路 耳放_SOLO耳放分析,带PCB布线
- 基于java(springboot框架)的购物商城系统 毕业论文
- 【译】CSS 十六进制颜色揭秘
热门文章
- mysql更新一个表里的字段等于另一个表某字段的值
- 分布式缓存之Memcache
- 博客搬迁至网易博客 http://happyboy200032.blog.163.com
- ScottGu之博客翻译-LINQ to SQL第三部分,查询数据库 (Part 3 - Querying our Database)
- [Rtsp]RTSP对实时摄像头视频流进行转换(FFmpeg+FFserver)
- Bean的id、name、ref、refid
- 【前端大概一分钟】css隐藏滚动条同时可以滚动
- 玩转Excel系列-SUMIFS函数使用及实例
- OpenStack Austin 峰会观察:OpenStack as IaaS 已是过去,Solutions on OpenStack 才是未来
- The RSpec Book笔记《一》初步认识TDD,BDD,RSpec,Cucumber