RabbitMQ—direct(直接交换模式)


一、什么是direct(直接交换模式)

生产者和消费者,具有相同的交换机名称(Exchange)、交换机类型和相同的密匙(routingKey),那么消费者即可成功获取到消息。
(PS:相对比只要交换机名称即可接收到消息的广播模式(fanout),direct模式在其基础上,多加了一层密码限制(routingKey)。)

RabbitMQ消息模型的核心思想(core idea): 生产者会把消息发送给RabbitMQ的交换中心(Exchange),Exchange的一侧是生产者,另一侧则是一个或多个队列,由Exchange决定一条消息的生命周期–发送给某些队列,或者直接丢弃掉。


二、代码域

1. 生产者【DirectBoss】

package com.iyungu.phantaci.test.rabbitmq;import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.apache.log4j.Logger;import java.io.IOException;
import java.util.concurrent.TimeoutException;
//消息生产者
public class DirectBoss {private static final Logger logger = Logger.getLogger(DirectBoss.class);
public static void main(String[] args) {ConnectionFactory factory = new ConnectionFactory();try {factory.setHost("localhost");Connection connection = factory.newConnection();Channel channel = connection.createChannel();//声明交换机(名称和类型)channel.exchangeDeclare("directLogs", BuiltinExchangeType.DIRECT);String message = "2018年8月8日14:03:48";//消息发布(其中"directLogs"为交换机名称,"jay"为routingKey)channel.basicPublish("directLogs","jay",null,message.getBytes());logger.info("********Message********:发送成功");channel.close();connection.close();} catch (IOException | TimeoutException e) {e.printStackTrace();}
}

}

2. 消费者【DirectWorker】

package com.iyungu.phantaci.test.rabbitmq;import com.rabbitmq.client.*;
import org.apache.log4j.Logger;import java.io.IOException;
import java.util.concurrent.TimeoutException;//消息消费者
public class DirectWorker {private static final Logger logger = Logger.getLogger(DirectWorker.class);public static void main(String[] args) {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try {Connection connection = factory.newConnection();Channel channel = connection.createChannel();//交换机声明(参数为:交换机名称;交换机类型)channel.exchangeDeclare("directLogs", BuiltinExchangeType.DIRECT);//获取一个临时队列String queueName = channel.queueDeclare().getQueue();//队列与交换机绑定(参数为:队列名称;交换机名称;密匙-routingKey)channel.queueBind(queueName,"directLogs","jay");logger.info("********Waiting for messages********");//这里重写了DefaultConsumer的handleDelivery方法,因为发送的时候对消息进行了getByte(),在这里要重新组装成StringConsumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {super.handleDelivery(consumerTag, envelope, properties, body);String message = new String(body,"UTF-8");logger.info("received:" + message);}};//声明队列中被消费掉的消息(参数为:队列名称;消息是否自动确认;consumer主体)channel.basicConsume(queueName,true,consumer);//这里不能关闭连接,调用了消费方法后,消费者会一直连接着rabbitMQ等待消费} catch (IOException |TimeoutException e) {e.printStackTrace();}}}

三、direct模式效果

1.1)先运行一个消费者,即【DirectWorker】

2)把消费者【DirectWorker】里的routingKey进行修改

channel.queueBind(queueName,"directLogs","jay");修改为channel.queueBind(queueName,"directLogs","jjlin");。修改完毕后,再运行该消费者

RabbitMQ网页控制台如下,可看到两个消费者队列

2. 再运行一个生产者,即【DirectBoss】

控制台效果图如下,一条消息发布后,和交换机routingKey一致的消费者收到了消息,不一致的无消息;

消息是由生产者发送给交换机,所以要以生产者发布消息时的routingKey为准。此时,生产者里的routingKey为:”jay”

消费者的routingKey为:”jay“,与生产者一致。消息接收成功

消费者的routingKey为:”jjlin“,与生产者不一致。消息接收失败


四、多路由(routingKey)接收

通过给消费者绑定多个路由(routingKey),可以使该消费者同时接收多个路由获取的消息。

如给消费者代码【DirectWorker】同时绑定两个routingKey,其余不变

channel.queueBind(queueName, "directLogs", "jjlin"); //routingKey为jjlin
channel.queueBind(queueName, "directLogs", "jay"); //routingKey为jay

1.绑定两个routingKey后,运行一个消费者【DirectWorker】

2.运行一个生产者【DirectBoss】,代码默认其routingKey为”jay”


3.修改生产者routingKey为”jjlin”,然后再运行生产者【DirectBoss】

把生产者代码里的routingKey进行修改,即channel.basicPublish("directLogs","jay",null,message.getBytes());改为channel.basicPublish("directLogs","jjlin",null,message.getBytes());,修改完毕后再运行生产者。

4.局限性

通过多路由绑定的例子,可以体会到direct模式相对比fanout模式,可以选择性的接收消息;但局限是面对更多、更复杂的路由匹配时,仍旧会力不从心,这时可以使用更全面的topic主题模式。

参考:http://www.rabbitmq.com/tutorials/tutorial-four-java.html,http://www.cnblogs.com/4—-/p/6518801.html,感谢分享

rabbitmq-direct(直接交换模式)相关推荐

  1. 4.RabbitMQ 4种交换模式

    请看 demo https://github.com/kevin-li-06/eshop.git 转载于:https://www.cnblogs.com/likevin/p/9202192.html

  2. rabbitmq direct 多个消费者_一文解析 RabbitMQ 最常用的三大模式

    Direct 模式 所有发送到 Direct Exchange 的消息被转发到 RouteKey 中指定的 Queue. Direct 模式可以使用 RabbitMQ 自带的 Exchange: de ...

  3. RabbitMQ的Routing 路由模式(Direct)

    RabbitMQ的Routing 路由模式 模式说明: 队列与交换机的绑定,不能是任意绑定了,而是要指定一个 RoutingKey(路由key) 消息的发送方在向 Exchange 发送消息时,也必须 ...

  4. RabbitMQ学习记录 - Direct之Routing模式

    (内容均来自RabbitMQ官网:https://www.rabbitmq.com/tutorials/tutorial-four-java.html) 前面几篇学习了下RabbitMQ的" ...

  5. rabbitmq几种工作模式_RabbitMQ的六种工作模式总结

    精品推荐 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布! 作者:侧身左睡 https://www.cnblogs.com/xyfer1018/p/11581511.ht ...

  6. RabbitMQ三种订阅模式

    订阅模式 Fanout Exchange--订阅模式 Direct Exchange--路由模式 Topic Exchange--通配符模式 Fanout Exchange 不处理路由键,只需要简单的 ...

  7. RabbitMQ的Topics 通配符模式(Topic)

    RabbitMQ的Topics 通配符模式(Topic) 模式说明 Topic 类型与 Direct 相比,都是可以根据 RoutingKey 把消息路由到不同的队列.只不过 Topic 类型Exch ...

  8. RabbitMQ五种工作模式

    RabbitMQ五种工作模式 1.简单队列 一个生产者对应一个消费者!! 2.work 模式 一个生产者对应多个消费者,但是一条消息只能有一个消费者获得消息!!! 轮询分发就是将消息队列中的消息,依次 ...

  9. rabbitmq direct reply-to 在springAMQP和python之间的使用

    背景 公司的一个项目使用rabbitmq作为broker进行交互,并且数据的查询方法使用RPC模式,RPC Client端使用java编写并使用springAMQP包与rabbitmq交互,在RPC ...

最新文章

  1. VMWare中CentOS7 设置固定IP且能够访问外网
  2. Python是世界上最好的语言,你不服不行!(附资料)
  3. 不重新编译DLL,让FCKEditor支持附件上传
  4. 与TIME_WAIT相关的几个内核参数
  5. 2017年15佳Android黑客应用
  6. ubuntu E470无线网卡驱动
  7. head 查看文件前n行
  8. 用计算机代码怎么表白,程序员如何用代码向喜欢的人表白?
  9. 计算100以内奇数和偶数的数量
  10. 组态王gprs虚拟服务器,GPRS/CDMA 网络通过组态王软件虚拟串口(IO/设备)实现无线远程...
  11. 关于输入法拼音拆分算法
  12. 大数据在人力资源管理当中的应用
  13. 芯片自主注释流程代码
  14. 如何为您的应用选择合适的微控制器?
  15. typora导出word指定样式_Word长文档排版以写论文为例
  16. QQ邮箱服务器协议,QQ邮箱新功能 IMAP协议支持
  17. 2020-06-29
  18. 教育培训行业市场营销推广方案分享
  19. Excel绘制散点图并拟合输出公式和R值
  20. 【微信小程序】全局分享和页面分享

热门文章

  1. WeUI 为微信 Web打造权限UI框架
  2. php提取视频中的音频-ffmpeg
  3. SU2 多段翼型的计算结果
  4. SlySoft.AnyDVD.HD.v6.4.6.2.Multilingual.WinAll.Incl.Keygen.and.Patch-BRD
  5. translate与REGEXP
  6. 第三天操作系统、网址、B/S、C/S
  7. Python调用c/c++动态库(一)
  8. QT学习笔记-画点线圆
  9. sql文件太大无法导入问题的解决
  10. 2、Canvas 的应用场景