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. python连接集群mongodb,封装增删改查

    1.下载pymongo pip install pymongo 2.直接上代码 [ini配置文件] 封装读ini省略~~ [db.py] class Database(): def __init__( ...

  2. Java 8 新特性 用 Collectors 对 List 去重

    场景:有一个实体的List集合,需要根据实体中的某个字段对List去重 Collectors.collectingAndThen方法:将流中的数据通过Collector计算,计算的结果再通过Funct ...

  3. Django笔记&教程 5-1 基础增删查改

    Django 自学笔记兼学习教程第5章第1节--基础增删查改 点击查看教程总目录 第四章介绍了模型类models.Model和创建模型,相当于介绍了数据库表和如何创建数据库表. 这一章将介绍如何使用模 ...

  4. Java JDBC 理论笔记

    一.JDBC常用接口.类介绍 JDBC提供对独立于数据库统一的API,用以执行SQL命令.API常用的类.接口如下: DriverManager 管理JDBC驱动的服务类,主要通过它获取Connect ...

  5. Asp.Net Core中简单使用日志组件log4net

    本文将简单介绍在.NET 6中使用log4net的方法,具体见下文范例. 1.首先新建一个ASP.NET Core空项目 2.通过Nuget包管理器安装下面两个包 log4net Microsoft. ...

  6. [bzoj1190]梦幻岛宝珠

    根据$2^b$分组,组内处理出g[i][j]表示当容量为$j\cdot 2^{i}$且只能选b=i时最大价值,再组间dp用f[i][j]表示当容量为$j\cdot 2^{i}+(w\&(2^{ ...

  7. 如何解决 ASP.NET Core 中的依赖问题

    依赖性注入是一种技术,它允许我们注入一个特定类的依赖对象,而不是直接创建这些实例. 使用依赖注入的好处显而易见,它通过放松模块间的耦合,来增强系统的可维护性和可测试性. 依赖注入允许我们修改具体实现, ...

  8. 前台json遍历拼装

    //添加角色. $.ajax({ type: "post", url: "/sysRole/list", data: {page: 1, limit: 1000 ...

  9. 【2020五校联考NOIP #8】自闭

    题目传送门 题意: 有一个 \(n \times m\) 的矩阵,里面已经填好了 \(k\) 个非负整数. 问是否能在其它 \(n \times m-k\) 个格子里各填上一个非负整数,使得得到的矩阵 ...

  10. CF605E Intergalaxy Trips

    CF605E Intergalaxy Trips 考虑你是不知道后来的边的出现情况的,所以可以这样做:每天你都选择一些点进行观察,知道某天往这些点里面的某条边可用了,你就往这条边走.这样贪心总是对的. ...