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. HVV奇兵—网页防篡改系统在网络安全实战演习中的妙用(上)

    近年来,网络安全实战演习受到各大关基单位的高度关注.对于网络安全实战演习的防守方,防火墙.Web应用防火墙.态势感知.EDR.蜜罐等都是较为常见的防守工具,而网页防篡改系统则鲜有露脸的机会-- 很多人 ...

  2. 25.A Famous Music Composer

    描述 Mr. B is a famous music composer. One of his most famous work was his set of preludes. These 24 p ...

  3. 8大原则带你秒懂Happens-Before原则

    摘要:在并发编程中,Happens-Before原则是我们必须要掌握的,今天我们就一起来详细聊聊并发编程中的Happens-Before原则. 本文分享自华为云社区<[高并发]一文秒懂Happe ...

  4. Java 初始化与清理

    用构造器确保初始化 如何自定义构造器(constructor)? 构造器方法的名称与类名相同,并且没有返回值. 需要注意,在定义构方法时,方法名前面不要添加任何的类型说明符,格式:类名(){},构造方 ...

  5. SQL Server2019数据库备份与还原脚本,数据库可批量备份

    前言 最近公司服务器到期,需要进行数据迁移,而数据库属于多而繁琐,通过图形化界面一个一个备份所需时间成本很大,所以想着写一个sql脚本来执行. 开始 数据库单个备份 数据库批量备份 数据库还原 数据库 ...

  6. 小程序嵌套H5的方式和技巧(一)

    文章内多次使用了关键字"壳",首先先解释一下什么是壳 壳: 小程序由原生的web-view组件形成的页面,页面只包含技术逻辑(如打开H5页面),不包含具体业务接口请求和业务逻辑处理 ...

  7. redis可以设置过期key回调实现延时队列

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...

  8. 多线程01.newThread的方式创建线程

    1.java应用程序的main函数是一个线程,是被jvm启动的时候调用,线程的名字叫main 2.实现一个线程,必须创建一个thread实例,override run方法,并且调用start方法. 3 ...

  9. HDU 3267 Graph Game(博弈论+图论+暴力)

    题面传送门 题意: 有一棵 \(n\) 个节点的图 \(G\),R 和 B 两个人轮流操作,R 先操作. 每次操作 R 可以染红任意一条未染色的边,B 可以染蓝任意一条未染色的边 R 的目标是染成一棵 ...

  10. LOJ 3399 -「2020-2021 集训队作业」Communication Network(推式子+组合意义+树形 DP)

    题面传送门 一道推式子题. 首先列出柿子,\(ans=\sum\limits_{T_2}|T_1\cap T_2|·2^{T_1\cap T_2}\) 这个东西没法直接处理,不过注意到有一个柿子 \( ...