目录:

  • RabbitMQ几大组件
  • 交换器类型
  • RabbitMQ运行流程

RabbitMQ几大组件:(与RabbitMQ第一节中AMQP一样,不细说)

1、生产者、消费者、消息

2、Broker:简单的来说broker就是一个RabbitMQ的一个服务节点

3、队列

4、交换器、路由键、绑定键

交换器类型:

1、fanout(分列):把所有发送到该交换器上的消息,路由到与该交换器绑定的队列中。

 public class Product {

     private static final String EXCHANGE_NAME = "exchange";
private static final String QUEUE_NAME = "exchange_queue1";
private static final String QUEUE_NAME2 = "exchange_queue2";
private static final String ROUTING_KEY = "exchange_routingKey";
private static final String ROUTING_KEY2 = "exchange_routingKey2"; public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = getConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT); // 定义队列1、队列2
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.queueDeclare(QUEUE_NAME2, false, false, false, null);
// 将队列1、队列2绑定到同一个fanout交换器上,但路由键不一样
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
channel.queueBind(QUEUE_NAME2, EXCHANGE_NAME, ROUTING_KEY2); // 仅发送路由键1的消息,但因绑定键是fanout类型,所以队列1和队列2都会受到消息
channel.basicPublish(EXCHANGE_NAME,
ROUTING_KEY,
MessageProperties.PERSISTENT_TEXT_PLAIN,
"Hello world".getBytes()); close(connection, channel);
}
}

2、direct(直接):需要bindingKey和routingKey完全匹配才能成功发送消息。

就fanout例子的第12行代码修改为channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);(注意:修改代码运行前,需要先将原先绑定的交换器删掉,因为之前那个交换器已经是fantou类型了;或者是定义一个新的交换器)

便只有exchange_queue1才能接受到消息,便为2。

3、topic(主题):与direct类似,但支持通配符匹配(类似于广播)。

  • #:匹配多个或零个单词
  • *:匹配一个单词

4、header:不是根据路由键的匹配规则,而是通过发送消息中的header来匹配。

RabbitMQ运行流程:

1、生产者:

  • 生产者与Broker建立连接并开启信道
  • 生产者声明交换器(交换器类型、是否持久化、是否自动删除)、队列(是否持久化、是否排他、是否自动删除)
  • 生产者通过路由键将交换器和队列绑定
  • 生产者发送消息到Broker(携带路由键等)
  • 交换器再根据接收到的路由键以及交换器类型查找相匹配的队列,如果匹配上了将消息存入队列中,若未匹配上,则根据生产者的配置决定丢弃或是退回给生产者
  • 关闭信道和连接

2、消费者:

  • 消费者与Broker建立连接并开启信道
  • 消费者向Broker请求消费相对应的队列,此中可以设置回调函数
  • 接受并处理消息
  • 消费者可以确认消息(ack)
  • RabbitMQ从队列中删除已被确认的消息
  • 关闭信道和连接

RabbitMQ学习笔记(二、RabbitMQ结构)的更多相关文章

  1. .NET之RabbitMQ学习笔记(二)-安装

    安装 1.安装erlang语言环境 因为rabbitmq是基于erlang进行开发,所以需要安装相应的依赖环境,学习中用到的erlang包下载地址:http://www.erlang.org/down ...

  2. rabbitMQ学习笔记(二) 简单的发送与接收消息 HelloWorld

    首先要下载rabbitmq的javaClient库,然后加入到项目中,下载地址为:http://www.rabbitmq.com/releases/rabbitmq-java-client/v3.1. ...

  3. rabbitMq 学习笔记(二) 备份交换器,过期时间,死信队列,死信队列

    备份交换器 备份交换器,英文名称为 Altemate Exchange,简称庙,或者更直白地称之为"备胎交换器". 生产者在发送消息的时候如果不设置 mandatory 参数, 那 ...

  4. RabbitMQ学习笔记二:Java实现RabbitMQ

    本地安装好RabbitMQ Server后,就可以在Java语言中使用RabbitMQ了. RabbitMQ是一个消息代理,从"生产者"接收消息并传递消息至"消费者&qu ...

  5. HighCharts学习笔记(二)HighCharts结构及详细配置

    HighCharts结构及详细配置: 一.HighCharts整体结构: 通过查看API文档我们知道HighCharts结构如下:(API文档在文章后面提供下载) var chart = new Hi ...

  6. [RabbitMQ学习笔记] - 初识RabbitMQ

    RabbitMQ是一个由erlang开发的AMQP的开源实现. 核心概念 Message 消息,消息是不具名的,它由消息头和消息体组成,消息体是不透明的,而消息头则由 一系列的可选属性组成,这些属性包 ...

  7. 官网英文版学习——RabbitMQ学习笔记(十)RabbitMQ集群

    在第二节我们进行了RabbitMQ的安装,现在我们就RabbitMQ进行集群的搭建进行学习,参考官网地址是:http://www.rabbitmq.com/clustering.html 首先我们来看 ...

  8. RabbitMQ学习系列二-C#代码发送消息

    RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 http://www.80iter.com/blog/1437455520862503 上一篇已经讲了Rabbi ...

  9. 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ

    鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本 ...

  10. RabbitMQ学习笔记(五) Topic

    更多的问题 Direct Exchange帮助我们解决了分类发布与订阅消息的问题,但是Direct Exchange的问题是,它所使用的routingKey是一个简单字符串,这决定了它只能按照一个条件 ...

随机推荐

  1. python Djanjo csrf说明与配置

     Django csrf  CSRF 全称(Cross Site Request Forgery)跨站请求伪造.也被称为One Click Attack和Session Riding,通常缩写为CSR ...

  2. HTML5应用 转 Android、Windows Phone 应用

    一.HTML5 转 Android 目标SDK:API 20 1.新建一个 Blank Activity 的应用 2.在 AndroidManifest.xml 文件中添加联网权限 <uses- ...

  3. CodeForces - 1251D (贪心+二分)

    题意 https://vjudge.net/problem/CodeForces-1251D 您是一个大型企业的负责人.在您的企业当中共有n位员工为您工作,而且非常有趣的事是这个n是一个奇数(n不能被 ...

  4. 失败的一天(找bug)

    前天早上来到实验室,准备抓紧时间写写代码,毕竟第二天就是组会了.点了一下鼠标,发现显示屏无法唤醒,然后就准备强制关机再开机(我一般不关机,以前遇到过几次无法唤醒),低头发现主机不亮,然后按了开关也不亮 ...

  5. React中条件渲染

    17==> 条件渲染 state初始化一般写在构造器当中 CharShop.js如下 import React, { Component } from "react"; ex ...

  6. 2019-2020-1 20199305《Linux内核原理与分析》第五周作业

    系统调用的三层机制(上) (一)用户态.内核态和中断 (1)Intel x86 CPU有4种不同的执行级别 分别是0.1.2.3,数字越小,特权越高.Linux操作系统中只是采用了其中的0和3两个特权 ...

  7. Noip2018Day1T3 赛道修建

    题目链接 problem 给出一棵有边权的树.一条链的权值定义为该链所经过的边的边权值和.需要选出\(m\)条链,求\(m\)条链中权值最小的链的权值最大是多少. solution 首先显然二分. 然 ...

  8. 第04组 Beta冲刺(1/5)

    队名:new game 组长博客:戳 作业博客:戳 组员情况 鲍子涵(队长) 过去两天完成了哪些任务 验收游戏素材 学习Unity 2D Animation系统 接下来的计划 制作游戏需要的人物动画 ...

  9. 任意视频批量转码MP4-H264助手

    使用说明 简单的粗暴的小工具,利用windows命令行调用ffmpeg完成任意格式视频转换成H264编码的MP4视频,以确保视频可以在主流浏览器中直接播放,如:Chrome.Firefox等. 只需要 ...

  10. 【总结】《氨基酸新晋管理者领导力培训》第一次课_Day2_学习心得

    7月26日第二天学习心得: 今天主要学习了执行贯彻和绩效反馈两大块内容,我的心得有: 一.执行层面有两大原则:--理解员工需求: 回顾了一下自己以往的经历,一般这块我用的最多的一般是在接到一个新项目的 ...