Exchange:接收消息,并根据路由键转发消息所绑定的队列

ClientA,B将消息投递到交换机Exchange上,通过路由关系,投递到指定的queue1或者queue2上,通过监听投递到Client1...

交换机属性:

  Name:交换机名称

  Type:交换机类型direct、topic、fanout、headers

  Durability:是否需要持久化,true为持久化

  Auto Delete:当最后一个绑定到Exchange上的队列删除后,自动删除该Exchange

  Internal:当前Exchange是否用于RabbitMQ内部使用,默认为false

  Arguments:扩展参数,用于扩展AMQP协议自制定化使用

有直连对应关系的连接方式

Direct Exchange:所有发送到Direct Exchange的消息被转发到RoutKey中指定的Queue

        注:Direct模式可以使用RabbitMQ自带的Exchange:default Exchange,

          所以不需要将Exchange进行任何绑定(binding)操作,消息加投递时,

          RouteKey必须完全匹配才会被队列接收,否则该消息会被抛弃。

routing key要和 queues中的key的值相同,才可以路由到

       

         //生产端代码

         ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest"); Connection connection = connectionFactory.newConnection(); Channel channel = connection.createChannel(); String exchangeName = "test_direct_exchange";
String routingKey = "test.direct"; String str = "hello world";
channel.basicPublish(exchangeName, routingKey, null, str.getBytes());
        //消费端代码

        ConnectionFactory connectionFactory = new ConnectionFactory() ;

         connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/"); connectionFactory.setAutomaticRecoveryEnabled(true);
connectionFactory.setNetworkRecoveryInterval(3000);
Connection connection = connectionFactory.newConnection(); Channel channel = connection.createChannel();
//4 声明
String exchangeName = "test_direct_exchange";
String exchangeType = "direct";
String queueName = "test_direct_queue";
String routingKey = "test.direct"; //表示声明了一个交换机
channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);
//表示声明了一个队列
channel.queueDeclare(queueName, false, false, false, null);
//建立一个绑定关系:
channel.queueBind(queueName, exchangeName, routingKey); //durable 是否持久化消息
QueueingConsumer consumer = new QueueingConsumer(channel);
//参数:队列名称、是否自动ACK、Consumer
channel.basicConsume(queueName, true, consumer);
//循环获取消息
while(true){
//获取消息,如果没有消息,这一步将会一直阻塞
Delivery delivery = consumer.nextDelivery();
String msg = new String(delivery.getBody());
System.out.println("收到消息:" + msg);
}

有路由规则,可模糊匹配的连接方式

Topic Exchange:所有发送到Topic Exchange的消息被转发到所有关心RouteKey中指定的Topic的Queue上

        Exchange将RouteKey和某Topic进行模糊匹配,此时队列需要绑定一个Topic

        注:可以使用通配符进行模糊匹配

          符号“#”匹配一个或多个词

          符号"*"匹配一个词

          例如:“log.#”能够匹配到“log.info.oa”

              "log.*"只会匹配到"log.erro"

     

  //生产端代码
//1 创建ConnectionFactory
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/"); //2 创建Connection
Connection connection = connectionFactory.newConnection();
//3 创建Channel
Channel channel = connection.createChannel();
//4 声明
String exchangeName = "test_topic_exchange";
String routingKey1 = "user.save";
String routingKey2 = "user.update";
String routingKey3 = "user.delete.abc";
//5 发送 String msg = "Hello World RabbitMQ 4 Topic Exchange Message ...";
channel.basicPublish(exchangeName, routingKey1 , null , msg.getBytes());
channel.basicPublish(exchangeName, routingKey2 , null , msg.getBytes());
channel.basicPublish(exchangeName, routingKey3 , null , msg.getBytes());
channel.close();
connection.close();
 1       //消费端代码
2 ConnectionFactory connectionFactory = new ConnectionFactory() ;
3
4 connectionFactory.setHost("127.0.0.1");
5 connectionFactory.setPort(5672);
6 connectionFactory.setVirtualHost("/");
7
8 connectionFactory.setAutomaticRecoveryEnabled(true);
9 connectionFactory.setNetworkRecoveryInterval(3000);
10 Connection connection = connectionFactory.newConnection();
11
12 Channel channel = connection.createChannel();
13 //4 声明
14 String exchangeName = "test_topic_exchange";
15 String exchangeType = "topic";
16 String queueName = "test_topic_queue";
17
//只能接收到前两条消息
//String routingKey = "user.*"; //可以接收到三条消息
18 String routingKey = "user.#";
19 // 1 声明交换机
20 channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);
21 // 2 声明队列
22 channel.queueDeclare(queueName, false, false, false, null);
23 // 3 建立交换机和队列的绑定关系:
24 channel.queueBind(queueName, exchangeName, routingKey);
25
26 //durable 是否持久化消息
27 QueueingConsumer consumer = new QueueingConsumer(channel);
28 //参数:队列名称、是否自动ACK、Consumer
29 channel.basicConsume(queueName, true, consumer);
30 //循环获取消息
31 while(true){
32 //获取消息,如果没有消息,这一步将会一直阻塞
33 Delivery delivery = consumer.nextDelivery();
34 String msg = new String(delivery.getBody());
35 System.out.println("收到消息:" + msg);
36 }

不做任何路由的连接方式

Fanout  Exchange:不处理路由键,只需简单的将队列绑定到交换机上

          发送到交换机的消息都会被转发到与该交换机绑定的队列上

             fanout交换机转发消息是最快的

      

              //生产者代码

               //1 创建ConnectionFactory
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/"); //2 创建Connection
Connection connection = connectionFactory.newConnection();
//3 创建Channel
Channel channel = connection.createChannel();
//4 声明
String exchangeName = "test_fanout_exchange";
//5 发送
for(int i = 0; i < 10; i ++) {
String msg = "Hello World RabbitMQ 4 FANOUT Exchange Message ...";
channel.basicPublish(exchangeName, "", null , msg.getBytes());
}
channel.close();
connection.close();
     //消费者端代码

     ConnectionFactory connectionFactory = new ConnectionFactory() ;  

         connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/"); connectionFactory.setAutomaticRecoveryEnabled(true);
connectionFactory.setNetworkRecoveryInterval(3000);
Connection connection = connectionFactory.newConnection(); Channel channel = connection.createChannel();
//4 声明
String exchangeName = "test_fanout_exchange";
String exchangeType = "fanout";
String queueName = "test_fanout_queue";
String routingKey = ""; //不设置路由键
channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);
channel.queueDeclare(queueName, false, false, false, null);
channel.queueBind(queueName, exchangeName, routingKey); //durable 是否持久化消息
QueueingConsumer consumer = new QueueingConsumer(channel);
//参数:队列名称、是否自动ACK、Consumer
channel.basicConsume(queueName, true, consumer);
//循环获取消息
while(true){
//获取消息,如果没有消息,这一步将会一直阻塞
Delivery delivery = consumer.nextDelivery();
String msg = new String(delivery.getBody());
System.out.println("收到消息:" + msg);
}

Headers Exchange:不常用,使用消息头来进行路由的

RabbitMQ(Exchange交换机详解)(四)的更多相关文章

  1. RabbitMQ Exchange类型详解

    前言 在上一篇文章中,我们知道了RabbitMQ的消息流程如下: 但在具体的使用中,我们还需知道exchange的类型,因为不同的类型对应不同的队列和路由规则. 在rabbitmq中,exchange ...

  2. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

    消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...

  3. pika详解(四) channel 通道

    pika详解(四) channel 通道   本文链接:https://blog.csdn.net/comprel/article/details/94662394 版权 ​ channel通道 通道 ...

  4. RabbitMQ基础知识详解

    什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中 ...

  5. .NET DLL 保护措施详解(四)各操作系统运行情况

    我准备了WEB应用程序及WinForm应用程序,分别在WIN SERVER 2012/2008/2003.Win7/10上实测,以下为实测结果截图: 2012 2008 2003 WIN7 WIN10 ...

  6. logback -- 配置详解 -- 四 -- <filter>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  7. 消息队列RabbitMQ基础知识详解

    一: 什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序或者模块对模块的通信方法.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另 ...

  8. RabbitMQ安装使用详解

    1.下载相应的版本安装:http://www.rabbitmq.com/download.htmleg:http://www.rabbitmq.com/releases/rabbitmq-server ...

  9. C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)

    前面三篇文章<C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)>.<C++11 并发指南六( <atomic> 类型详解二 std::at ...

随机推荐

  1. 20191127 Spring Boot官方文档学习(4.14-4.17)

    4.14.使用RestTemplate调用REST服务 如果需要从应用程序调用远程REST服务,则可以使用Spring Framework的RestTemplate类.由于RestTemplate实例 ...

  2. JProfiler监控

    原文: https://blog.csdn.net/jijilan/article/details/83022715

  3. HDU-4857 逃生(反向拓扑排序 + 逆向输出)

    逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  4. 02.AutoMapper 之扁平化(Flattening)

    https://www.jianshu.com/p/65099590c930   扁平化(Flattening) 对象映射器的常见用法是将一个复杂对象模型扁平化为一个简单模型.例如您有一个以下复杂模型 ...

  5. SpringMVC_放行静态资源

    静态资源到处都是坑!明白原理才能绕过这些坑! web.xml配置servlet中四种路径的区别 在web.xml文件的配置中,四种路径编写方式优先级如下图: 其中b和d都能接收所有请求,仅仅是在优先级 ...

  6. 【React 6/100】 React原理 | setState | JSX语法转换 | 组件更新机制

    ****关键字 | setState | JSX语法转换 | 组件更新机制 组件更新机制 setState() 的两个作用 修改state 更新组件 过程:父组件重新渲染时,也会重新渲染子组件,但只会 ...

  7. 电子邮件协议:SMTP、POP3、IMAP4

    常见的电子邮件协议:SMTP.POP3.IMAP4   邮件发送协议:SMTP协议 邮件读取协议:POP3.IMAP4协议   SMTP协议(simple mail transfer protocol ...

  8. mkfs - 创建一个 Linux 文件系统

    总览 mkfs [ -V ] [ -t 文件系统类型 ] [ fs-选项 ] 文件系统 [ 块 ] 描述 mkfs mkfs 用来在指定设备创建一个 Linux 文件系统,通常是在硬盘上. 文件系统 ...

  9. 初学Git——命令总结

    首先,感谢廖雪峰老师制作的Git教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b0 ...

  10. CentOS上安装Git及配置远程仓库

    首先登陆CentOS服务器,连接上服务器之后我们使用yum remove git 命令删除已安装的Git,若之前没安装过Git则不需要这一步.注意前提是你的CentOS服务器上安装了yum,这是Cen ...