1.RabbitMq是什么?
    MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。RabbitMQ官方地址:http://www.rabbitmq.com/
开发中消息队列通常有如下应用场景:
      1)、任务异步处理。
           将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间
      2)、应用程序解耦合 MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合
2.市场上还有哪些消息队列?
     ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ、Redis。

3.为什么使用RabbitMQ呢?

1、使得简单,功能强大。

2、基于AMQP协议。

3、社区活跃,文档完善。
4、高并发性能好,这主要得益于Erlang语言。

5、Spring Boot默认已集成RabbitMQ

2.RabbitMQ的工作原理

组成部分说明如下:
Broker:消息队列服务进程,此进程包括两个部分:

Exchange和Queue。

Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑

Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方

Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ

Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。

消息发布接收流程:
-----发送消息----

1、生产者和Broker建立TCP连接
2、生产者和Broker建立通道

3、生产者通过通道消息发送给Broker,由Exchange将消息进行转发

4、Exchange将消息转发到指定的Queue(队列)

----接收消息----
1、消费者和Broker建立TCP连接

2、消费者和Broker建立通

3、消费者监听指定的Queue(队列)
4、当有消息到达Queue时Broker默认将消息推送给消费者。

5、消费者接收到消息。

5.测试

1) 创建maven工程 创建生产者工程和消费者工程,分别加入RabbitMQ java client的依赖。

test-rabbitmq-producer:生产者工程
test-rabbitmq-consumer:消费者工程

<dependency>    
 <groupId>com.rabbitmq</groupId>   
  <artifactId>amqp‐client</artifactId>    
 <version>4.0.3</version>
<!‐‐此版本与spring boot 1.5.9版本匹配‐‐>
</dependency>
<dependency>     
<groupId>org.springframework.boot</groupId>    
 <artifactId>spring‐boot‐starter‐logging</artifactId>
</dependency>

2)消费者

  //队列名称
private static final String QUEUE = "helloworld";

ConnectionFactory factory = new ConnectionFactory();           
  factory.setHost("localhost");             
factory.setPort(5672);            
  factory.setUsername("guest");           
  factory.setPassword("guest");           
  factory.setVirtualHost("/");
//创建与RabbitMQ服务的TCP连接
connection  = factory.newConnection();
 //创建与Exchange的通道,每个连接可以创建多个通道,每个通道代表一个会话任务
channel = connection.createChannel();
//声明队列
//pram1:队列名称,param2:是否持久化,pram3:队列是否独占此连接,param4:队列不再使用时是否自动删除此队列,param5:队列参数
channel.queueDeclare(QUEUE, true, false, false, null);
String message = "helloworld小明"+System.currentTimeMillis();
//消息发布
//param1:Exchange的名称,如果没有指定,则使用Default Exchange
//param2:routingKey,消息的路由Key,是用于Exchange(交换机)将消息转发到指定的消息队列
//param3:消息包含的属性
//param4:消息体
channel.basicPublish("", QUEUE, null, message.getBytes());

3)消费者

 ConnectionFactory factory = new ConnectionFactory();        
 //设置MabbitMQ所在服务器的ip和端口        
 factory.setHost("127.0.0.1");        
 factory.setPort(5672);   
//创建与RabbitMQ服务的TCP连接      
Connection connection = factory.newConnection();
//创建与Exchange的通道,每个连接可以创建多个通道,每个通道代表一个会话任务      
 Channel channel = connection.createChannel();         
//声明队列         
channel.queueDeclare(QUEUE, true, false, false, null);
DefaultConsumer consumer = new DefaultConsumer(channel) {
 @Override             
//param1: @param consumerTag 消费者的标签,在channel.basicConsume()去指定
//param2:消息包的内容,可从中获取消息id,消息routingkey,交换机,消息和重传标志 (收到消息失败后是否需要重新发送)
//properties
//body
public void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body)throws IOException {     
        //交换机                 
String exchange = envelope.getExchange();                
 //路由key                 
String routingKey = envelope.getRoutingKey();                
 //消息id                
 long deliveryTag = envelope.getDeliveryTag();                 
//消息内容                 
String msg = new String(body,"utf‐8");                
 System.out.println("receive message.." + msg);             }
}
//队列名称,是否自动回复,消息消费的方法
  channel.basicConsume(QUEUE, true, consumer);

6.总结

1、发送端操作流程
 1)创建连接
  2)创建通道
  3)声明队列
 4)发送消息

2、接收端

 1)创建连接
  2)创建通道
  3)声明队列
 4)监听队列
  5)接收消息

  6)ack回复

7.rabbit-mq的工作模式

1、Work queues
2、Publish/Subscribe
3、Routing
4、Topics
5、Header
6、RPC

  

 

 

1.RabbitMQ的更多相关文章

  1. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  2. RabbitMq应用二

    在应用一中,基本的消息队列使用已经完成了,在实际项目中,一定会出现各种各样的需求和问题,rabbitmq内置的很多强大机制和功能会帮助我们解决很多的问题,下面就一个一个的一起学习一下. 消息响应机制 ...

  3. 如何优雅的使用RabbitMQ

    RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具.消息队列的使用场景大概有3种: 1.系统集成,分布式系统的设 ...

  4. RabbitMq应用一的补充(RabbitMQ的应用场景)

    直接进入正题. 一.异步处理 场景:发送手机验证码,邮件 传统古老处理方式如下图 这个流程,全部在主线程完成,注册->入库->发送邮件->发送短信,由于都在主线程,所以要等待每一步完 ...

  5. RabbitMq应用一

    RabbitMq应用一 RabbitMQ的具体概念,百度百科一下,我这里说一下我的理解,如果有少或者不对的地方,欢迎纠正和补充. 一个项目架构,小的时候,一般都是传统的单一网站系统,或者项目,三层架构 ...

  6. 缓存、队列(Memcached、redis、RabbitMQ)

    本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...

  7. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

  8. windows下 安装 rabbitMQ 及操作常用命令

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...

  9. RabbitMQ + PHP (三)案例演示

    今天用一个简单的案例来实现 RabbitMQ + PHP 这个消息队列的运行机制. 主要分为两个部分: 第一:发送者(publisher) 第二:消费者(consumer) (一)生产者 (创建一个r ...

  10. RabbitMQ + PHP (二)AMQP拓展安装

    上篇说到了 RabbitMQ 的安装. 这次要在讲案例之前,需要安装PHP的AMQP扩展.不然可能会报以下两个错误. 1.Fatal error: Class 'AMQPConnection' not ...

随机推荐

  1. c++学习笔记6(结构化程序设计的不足)

    结构化程序设计 c语言使用结构化程序设计: 程序=数据结构+算法 程序有全局变量以及众多相互调用的函数组成 算法以函数的形式实现,用于对数据结构进行操作 结构化程序设计不足 软件业的目标是更快,更正确 ...

  2. [loj2469]最小方差生成树

    2018年论文题 约定:令点集$V=[1,n]$.边集$E=[1,m]$,记$m$条边依次为$e_{i}=(x_{i},y_{i},c_{i})$(其中$1\le i\le m$),将其按照$c_{i ...

  3. [loj3032]馕

    (直接贪心会导致分子和分母过大) 令$S_{i}=\sum_{j=1}^{L}V_{i,j}$(即其独吞整个馕的快乐度),对第$i$个人求出$n$个位置$x_{1},x_{2},...,x_{n-1} ...

  4. [loj3342]制作菜品

    当$n-1\le m$,不妨令$d_{1}\le d_{2}\le...\le d_{n}$,则$(n-1)k\le mk=\sum_{i=1}^{n}d_{i}\le d_{1}+(n-1)d_{n ...

  5. Dubbo的反序列化安全问题——kryo和fst

    目录 0 前言 1 Dubbo的协议设计 2 Dubbo中的kryo序列化协议触发点 3 Dubbo中的fst序列化协议触发点 3.1 fst复现 3. 2 思路梳理 4 总结 0 前言 本篇是Dub ...

  6. AOP实现方式二

    applicationContext.xml <!--方法二 自定义类--> <bean id="diyPointCut" class="com.sha ...

  7. 8.4 k8s实现Nginx+Php+WordPress+MySQL实现完全容器化的web站点案例

    1.制作Nginx镜像 1.1 使用nginx:1.21.1官方镜像 # 下载官方镜像 docker pull nginx:1.21.1 # 打本地harbor的tag docker tag 192. ...

  8. vue-cli的安装步骤

    1.安装Node.js 在Node.js官网 https://nodejs.org/zh-cn/下载安装包,修改安装路径到其它盘,如 G:\Program Files 2.设置 cnpm的下载路径和缓 ...

  9. AT3945 [ARC092D] Two Faced Edges

    要求,翻转一条边,强连通分量个数是否会改变. 考虑连通分量个数会改变的因素: 即\(v\to u\)是否成立,以及翻转前,是否有一条\(u \to v\)的路径不经过该条边 以上当只有一个满足时,连通 ...

  10. 【机器学习与R语言】1-机器学习简介

    目录 1.基本概念 2.选择机器学习算法 3.使用R进行机器学习 1.基本概念 机器学习:发明算法将数据转化为智能行为 数据挖掘 VS 机器学习:前者侧重寻找有价值的信息,后者侧重执行已知的任务.后者 ...