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

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

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(),在这里要重新组装成String
Consumer consumer = new DefaultConsumer(channel) {
@Override
public 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主题模式。

原文链接:https://blog.csdn.net/fakerswe/article/details/81508963

rabbitmq-direct(直接交换模式)的更多相关文章

  1. 4.RabbitMQ 4种交换模式

    请看 demo https://github.com/kevin-li-06/eshop.git

  2. RabbitMQ消息交换模式简介

    RabbitMQ是AMQP的一个典型实现,它消息发布者的消息发布到Exchange上,同时需要制定routingkey,可以通过指定交换机的不同模式实现不同的行为. RabbitMQ提供了四种Exch ...

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

    RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较 RabbitMQ中,除了Simple Queue和Work Queue之外的所有生产者提交的消息都由Exc ...

  4. RabbitMq 6种使用模式

    RabbitMQ的5种模式与实例 1.1 简单模式Hello World 功能:一个生产者P发送消息到队列Q,一个消费者C接收 生产者实现思路: 创建连接工厂ConnectionFactory,设置服 ...

  5. RabbitMQ详解(三)------RabbitMQ的五种模式

    RabbitMQ详解(三)------RabbitMQ的五种模式 1.简单队列(模式) 上一篇文章末尾的实例给出的代码就是简单模式. 一个生产者对应一个消费者!!! pom.xml ​ 必须导入Rab ...

  6. RabbitMQ的六种工作模式总结

    最近学习RabbitMQ的使用方式,记录下来,方便以后使用,也方便和大家共享,相互交流. RabbitMQ的六种工作模式: 1.Work queues2.Publish/subscribe3.Rout ...

  7. 【RabbitMQ学习之二】RabbitMQ四种交换机模式应用

    环境 win7 rabbitmq-server-3.7.17 Erlang 22.1 一.概念1.队列队列用于临时存储消息和转发消息.队列类型有两种,即时队列和延时队列. 即时队列:队列中的消息会被立 ...

  8. RabbitMQ : 几种Exchange 模式

    AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列.生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机.先由Exchange来接收,然后Exchang ...

  9. 【转】RabbitMQ三种Exchange模式

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

随机推荐

  1. Ranger-Sqoop2插件安装

    Ranger-Sqoop2插件安装,基于Ranger版本1.0.0,支持Sqoop2版本1.99.7. 1.获取安装包 scp root@10.43.159.11:/home/compile/rang ...

  2. linux 设置开机自动启动应用

    作为一个开发,项目现在一般都是部署在虚拟机上的linux,数据库也是按照在l虚拟机上的linux,一旦关机了,在开机程序都没打开,又要一个个去开,很麻烦,所以现在我现在使用supervisor去做一个 ...

  3. POJ 2442 Sequence堆 优先队列

    题目描述 给定m个序列,每个序列包含n个非负整数.现在我们可以从每个序列中选择一个数字以形成一个具有m个整数的序列.显然,我们可以得到n ^ m种这种序列.然后,我们可以计算每个序列中的数字总和,并获 ...

  4. hisql 高级功能数据检测将错误数据拦截在系统外 一

    hisql github源码下载 git clone https://github.com/tansar/HiSql.git 在设计第二范式数据库时经常会把可能重复的数据单独做一种表关联,但是在写入表 ...

  5. hisql ORM 框架研究(国内第一个支持HANA的ORM框架)

    HiSql 操作说明文档 V1.0 下一代ORM框架 国内第一个支持HANA的ORM框架 hisql源码下载 git clone https://github.com/tansar/HiSql.git ...

  6. Postman保存token并使用token的整个流程

    1. 调通获取token的接口,包含传递参数的类型,和输入密码是否需要md5加密,根据接口的要求,传入数据 2. 查看接口响应的报文,可以看到token的有效时间,token的类型,里面的access ...

  7. 拓展 Array 方法

    为 Array 对象扩展了一个迭代器之后,就可以利用这个法代器进一步拓展 Array 的方法,使其能够完成更多的实用功能. Array.prototype.each = function( f ) { ...

  8. 【机器学习】svm

    机器学习算法--SVM 目录 机器学习算法--SVM 1. 背景 2. SVM推导 2.1 几何间隔和函数间隔 2.2 SVM原问题 2.3 SVM对偶问题 2.4 SMO算法 2.4.1 更新公式 ...

  9. 遇到奇怪的问题:web.py 0.40中使用web.input(),出现一堆奇怪的错误

    有的请求很正常,有的请求就出现了500错误. 这里使用POST请求,然后在web.input()中出现了很长很长的错误. 猜测是这个机器上安装了python2.7 / python 3.6 / pyt ...

  10. VAE变分自编码器

    我在学习VAE的时候遇到了很多问题,很多博客写的不太好理解,因此将很多内容重新进行了整合. 我自己的学习路线是先学EM算法再看的变分推断,最后学VAE,自我感觉这个线路比较好理解. 一.首先我们来宏观 ...