AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列。生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机。先由Exchange来接收,然后Exchange按照特定的策略转发到Queue进行存储。同理,消费者也是如此。Exchange 就类似于一个交换机,转发各个消息分发到相应的队列中。

RabbitMQ提供了四种Exchange模式:fanout、direct、topic、header 。 header模式在实际使用中较少。

Direct Exchange – 处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “dog”,则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog。

Java代码  
  1. Channel channel = connection.createChannel();
  2. channel.exchangeDeclare("exchangeName", "direct"); //direct fanout topic
  3. channel.queueDeclare("queueName");
  4. channel.queueBind("queueName", "exchangeName", "routingKey");
  5. byte[] messageBodyBytes = "hello world".getBytes();
  6. //需要绑定路由键
  7. channel.basicPublish("exchangeName", "routingKey", MessageProperties.PERSISTENT_TEXT_PLAIN, messageBodyBytes);

Fanout Exchange – 不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。

Java代码  
  1. Channel channel = connection.createChannel();
  2. channel.exchangeDeclare("exchangeName", "fanout"); //direct fanout topic
  3. channel.queueDeclare("queueName");
  4. channel.queueBind("queueName", "exchangeName", "routingKey");
  5. channel.queueDeclare("queueName1");
  6. channel.queueBind("queueName1", "exchangeName", "routingKey1");
  7. byte[] messageBodyBytes = "hello world".getBytes();
  8. //路由键需要设置为空
  9. channel.basicPublish("exchangeName", "", MessageProperties.PERSISTENT_TEXT_PLAIN, messageBodyBytes);

Topic Exchange – 将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到“audit.irs”。我在RedHat的朋友做了一张不错的图,来表明topic交换机是如何工作的:

Java代码  
  1. Channel channel = connection.createChannel();
  2. channel.exchangeDeclare("exchangeName", "topic"); //direct fanout topic
  3. channel.queueDeclare("queueName");
  4. channel.queueBind("queueName", "exchangeName", "routingKey.*");
  5. byte[] messageBodyBytes = "hello world".getBytes();
  6. channel.basicPublish("exchangeName", "routingKey.one", MessageProperties.PERSISTENT_TEXT_PLAIN, messageBodyBytes);

header exchange:

Headers类型的exchange使用的比较少,它也是忽略routingKey的一种路由方式。是使用Headers来匹配的。Headers是一个键值对,可以定义成Hashtable。发送者在发送的时候定义一些键值对,接收者也可以再绑定时候传入一些键值对,两者匹配的话,则对应的队列就可以收到消息。匹配有两种方式all和any。这两种方式是在接收端必须要用键值"x-mactch"来定义。all代表定义的多个键值对都要满足,而any则代码只要满足一个就可以了。fanout,direct,topic exchange的routingKey都需要要字符串形式的,而headers exchange则没有这个要求,因为键值对的值可以是任何类型。

1.生产者Producer.Java

[java] view plaincopy print?
  1. package cn.slimsmart.rabbitmq.demo.headers;
  2. import java.util.Date;
  3. import java.util.Hashtable;
  4. import java.util.Map;
  5. import org.springframework.amqp.core.ExchangeTypes;
  6. import com.rabbitmq.client.AMQP;
  7. import com.rabbitmq.client.AMQP.BasicProperties;
  8. import com.rabbitmq.client.AMQP.BasicProperties.Builder;
  9. import com.rabbitmq.client.Channel;
  10. import com.rabbitmq.client.Connection;
  11. import com.rabbitmq.client.ConnectionFactory;
  12. public class Producer {
  13. private final static String EXCHANGE_NAME = "header-exchange";
  14. @SuppressWarnings("deprecation")
  15. public static void main(String[] args) throws Exception {
  16. // 创建连接和频道
  17. ConnectionFactory factory = new ConnectionFactory();
  18. factory.setHost("192.168.36.102");
  19. // 指定用户 密码
  20. factory.setUsername("admin");
  21. factory.setPassword("admin");
  22. // 指定端口
  23. factory.setPort(AMQP.PROTOCOL.PORT);
  24. Connection connection = factory.newConnection();
  25. Channel channel = connection.createChannel();
  26. //声明转发器和类型headers
  27. channel.exchangeDeclare(EXCHANGE_NAME, ExchangeTypes.HEADERS,false,true,null);
  28. String message = new Date().toLocaleString() + " : log something";
  29. Map<String,Object> headers =  new Hashtable<String, Object>();
  30. headers.put("aaa", "01234");
  31. Builder properties = new BasicProperties.Builder();
  32. properties.headers(headers);
  33. // 指定消息发送到的转发器,绑定键值对headers键值对
  34. channel.basicPublish(EXCHANGE_NAME, "",properties.build(),message.getBytes());
  35. System.out.println("Sent message :'" + message + "'");
  36. channel.close();
  37. connection.close();
  38. }
  39. }

2.消费者Consumer.java

[java] view plaincopy print?
  1. package cn.slimsmart.rabbitmq.demo.headers;
  2. import java.util.Hashtable;
  3. import java.util.Map;
  4. import org.springframework.amqp.core.ExchangeTypes;
  5. import com.rabbitmq.client.AMQP;
  6. import com.rabbitmq.client.Channel;
  7. import com.rabbitmq.client.Connection;
  8. import com.rabbitmq.client.ConnectionFactory;
  9. import com.rabbitmq.client.QueueingConsumer;
  10. public class Consumer {
  11. private final static String EXCHANGE_NAME = "header-exchange";
  12. private final static String QUEUE_NAME = "header-queue";
  13. public static void main(String[] args) throws Exception {
  14. // 创建连接和频道
  15. ConnectionFactory factory = new ConnectionFactory();
  16. factory.setHost("192.168.36.102");
  17. // 指定用户 密码
  18. factory.setUsername("admin");
  19. factory.setPassword("admin");
  20. // 指定端口
  21. factory.setPort(AMQP.PROTOCOL.PORT);
  22. Connection connection = factory.newConnection();
  23. Channel channel = connection.createChannel();
  24. //声明转发器和类型headers
  25. channel.exchangeDeclare(EXCHANGE_NAME, ExchangeTypes.HEADERS,false,true,null);
  26. channel.queueDeclare(QUEUE_NAME,false, false, true,null);
  27. Map<String, Object> headers = new Hashtable<String, Object>();
  28. headers.put("x-match", "any");//all any
  29. headers.put("aaa", "01234");
  30. headers.put("bbb", "56789");
  31. // 为转发器指定队列,设置binding 绑定header键值对
  32. channel.queueBind(QUEUE_NAME, EXCHANGE_NAME,"", headers);
  33. QueueingConsumer consumer = new QueueingConsumer(channel);
  34. // 指定接收者,第二个参数为自动应答,无需手动应答
  35. channel.basicConsume(QUEUE_NAME, true, consumer);
  36. while (true) {
  37. QueueingConsumer.Delivery delivery = consumer.nextDelivery();
  38. String message = new String(delivery.getBody());
  39. System.out.println(message);
  40. }
  41. }
  42. }

实例代码:http://download.csdn.net/detail/tianwei7518/8136413

RabbitMQ 四种Exchange相关推荐

  1. RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较(转)

    RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 RabbitMQ提供了四种Exchange:fanout,direct, ...

  2. RabbitMQ - 4种Exchange类型

    在rabbitmq中,exchange有4个类型:direct,topic,fanout,header. direct exchange 此类型的exchange路由规则很简单: exchange在和 ...

  3. RabbitMQ第二话 -- Springboot基于四种Exchange(Direct、Fanout、Topic、Heders、延时队列)的实现和多虚拟主机下的生产消费者实现

    本文主要分享RabbitMQ exchange类型的功能和使用.RabbitMQ延时队列.一个springboot服务发送消息到多虚拟主机 1.RabbitMQ exchange exchange交换 ...

  4. 消息队列(四)——rabbitMQ四种工作模式

    RabbitMQ工作模式 模式总结: 1.简单模式helloworld 一个生产者,一个消费者,不需要交换机(使用默认交换机) 2.工作队列模式Work Queue 一个生产者,多个消费者(竞争关系) ...

  5. headers java_RabbitMQ四种Exchange类型之Headers(Java)

    版权声明:本文为博主原创文章,如果转载请给出原文链接:http://doofuu.com/article/4156157.html Headers 类型的Exchanges是不处理路由键的,而是根据发 ...

  6. RabbitMQ 四种类型发送接收数据方式

    1.基本用法 生产者 1 import pika 2 import sys 3 4 username = 'wt' #指定远程rabbitmq的用户名密码 5 pwd = '111111' 6 use ...

  7. RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较

    一.Direct Exchange 任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue. 1.一般情况可以使用rabbitMQ自带的Exchange:&quo ...

  8. RabbitMQ的四种交换机模式

    一.RabbitMQ的简单介绍 RabbitMQ作为一个消息队列,它负责提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全可靠. 消息(Message)由Client(客户端)发送,Ra ...

  9. RabbitMq(二)一文彻底弄懂RabbitMq的四种交换机原理及springboot实战应用

    四大交换机工作原理及实战应用 交换机概念 direct 直连交换机 工作模式图解 springboot代码 Fanout扇出交换机 工作模式图解 springboot代码 Topic主题交换机 工作模 ...

最新文章

  1. iOS10 推送通知 UserNotifications
  2. iso linux 内核版本号_Linux查看 iso 版本信息
  3. Django中的shell,和数据增删查改
  4. python模拟上传多张图片
  5. Linux系统可卸载内核模块完全指南(上)
  6. Dual-polarity supply provides ±12V from one IC
  7. 1.1 WEB API 在帮助文档页面进行测试
  8. 程序设计 Week15 字符串作业
  9. 2019年 腾讯校园招聘JAVA
  10. 1999年冬发出第一个论坛帖,弹指二十年后,他们遇见了AI
  11. 华为OD机试 - We Are A Team
  12. 使用HoloLens 2调用深度相机和前置摄像头
  13. [SPI+DMA] 驱动WS2812B显示时钟
  14. 如何拍出优秀风景摄影作品
  15. 折叠屏显示器比折叠屏手机更有价值
  16. 数据库--02--数据模型--层次模型.网状模型.关系模型
  17. Sgu 101 欧拉通路
  18. 生化危机4(来生/恶灵古堡IV)DVD/700M发布
  19. 数字电子技术基础(上)
  20. java实现红包要多少钱_2020情人节红包数字寓意 214情人节给女朋友发多少钱红包合适...

热门文章

  1. C语言二分法查找数组
  2. VTK:小部件之TextWidget
  3. VTK:PolyData之ExtractNormals
  4. VTK:Filtering之VectorFieldNonZeroExtraction
  5. VTK:Filtering之Delaunay2D
  6. QT的QDomElement类的使用
  7. QT的QCameraImageCapture类的使用
  8. 经典C语言程序100例之七零
  9. 下pg负载均衡_SAE 场景下,应用流量的负载均衡及路由策略配置实践
  10. 1、虚拟机内存管理、运行时数据区、线程共享区、Java堆、新生代、老年代、Eden区域分配、方法区、线程独占区、虚拟机栈