rabbitmq-direct(直接交换模式)
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(直接交换模式)相关推荐
- 4.RabbitMQ 4种交换模式
请看 demo https://github.com/kevin-li-06/eshop.git 转载于:https://www.cnblogs.com/likevin/p/9202192.html
- rabbitmq direct 多个消费者_一文解析 RabbitMQ 最常用的三大模式
Direct 模式 所有发送到 Direct Exchange 的消息被转发到 RouteKey 中指定的 Queue. Direct 模式可以使用 RabbitMQ 自带的 Exchange: de ...
- RabbitMQ的Routing 路由模式(Direct)
RabbitMQ的Routing 路由模式 模式说明: 队列与交换机的绑定,不能是任意绑定了,而是要指定一个 RoutingKey(路由key) 消息的发送方在向 Exchange 发送消息时,也必须 ...
- RabbitMQ学习记录 - Direct之Routing模式
(内容均来自RabbitMQ官网:https://www.rabbitmq.com/tutorials/tutorial-four-java.html) 前面几篇学习了下RabbitMQ的" ...
- rabbitmq几种工作模式_RabbitMQ的六种工作模式总结
精品推荐 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布! 作者:侧身左睡 https://www.cnblogs.com/xyfer1018/p/11581511.ht ...
- RabbitMQ三种订阅模式
订阅模式 Fanout Exchange--订阅模式 Direct Exchange--路由模式 Topic Exchange--通配符模式 Fanout Exchange 不处理路由键,只需要简单的 ...
- RabbitMQ的Topics 通配符模式(Topic)
RabbitMQ的Topics 通配符模式(Topic) 模式说明 Topic 类型与 Direct 相比,都是可以根据 RoutingKey 把消息路由到不同的队列.只不过 Topic 类型Exch ...
- RabbitMQ五种工作模式
RabbitMQ五种工作模式 1.简单队列 一个生产者对应一个消费者!! 2.work 模式 一个生产者对应多个消费者,但是一条消息只能有一个消费者获得消息!!! 轮询分发就是将消息队列中的消息,依次 ...
- rabbitmq direct reply-to 在springAMQP和python之间的使用
背景 公司的一个项目使用rabbitmq作为broker进行交互,并且数据的查询方法使用RPC模式,RPC Client端使用java编写并使用springAMQP包与rabbitmq交互,在RPC ...
最新文章
- VMWare中CentOS7 设置固定IP且能够访问外网
- Python是世界上最好的语言,你不服不行!(附资料)
- 不重新编译DLL,让FCKEditor支持附件上传
- 与TIME_WAIT相关的几个内核参数
- 2017年15佳Android黑客应用
- ubuntu E470无线网卡驱动
- head 查看文件前n行
- 用计算机代码怎么表白,程序员如何用代码向喜欢的人表白?
- 计算100以内奇数和偶数的数量
- 组态王gprs虚拟服务器,GPRS/CDMA 网络通过组态王软件虚拟串口(IO/设备)实现无线远程...
- 关于输入法拼音拆分算法
- 大数据在人力资源管理当中的应用
- 芯片自主注释流程代码
- 如何为您的应用选择合适的微控制器?
- typora导出word指定样式_Word长文档排版以写论文为例
- QQ邮箱服务器协议,QQ邮箱新功能 IMAP协议支持
- 2020-06-29
- 教育培训行业市场营销推广方案分享
- Excel绘制散点图并拟合输出公式和R值
- 【微信小程序】全局分享和页面分享
热门文章
- WeUI 为微信 Web打造权限UI框架
- php提取视频中的音频-ffmpeg
- SU2 多段翼型的计算结果
- SlySoft.AnyDVD.HD.v6.4.6.2.Multilingual.WinAll.Incl.Keygen.and.Patch-BRD
- translate与REGEXP
- 第三天操作系统、网址、B/S、C/S
- Python调用c/c++动态库(一)
- QT学习笔记-画点线圆
- sql文件太大无法导入问题的解决
- 2、Canvas 的应用场景