RabbitMQ--基础--7.4--工作模式--路由模式(Direct)

2023-11-13

RabbitMQ–基础–7.4–工作模式–路由模式(Direct)


代码位置

https://gitee.com/DanShenGuiZu/learnDemo/tree/master/rabbitMq-learn/rabbitMq-03

1、介绍

  1. Direct 模式在 Fanout 模式之上做了一个路由键 RoutingKey,对发送给交换机 Exchange 的消息进行筛选
  2. 每个消费者监听自己的队列,并且设置带统配符的 routingkey
  3. 生产者将消息发给broker,由交换机根据 routingkey 来转发消息到指定的队列

1.1、路由模式结构图

在这里插入图片描述

1.1.1、P

  1. 生产者
  2. 向交换机(Exchange)发送消息,发送消息时,会指定一个路由键 routing key

1.1.2、X

  1. 交换机(Exchange)
  2. 接收生产者的消息,然后把消息递交给 与 routing key 完全匹配的队列

1.1.3、Q1

  1. 队列(消费者监听此队列)
  2. 指定了绑定键(BindingKey)为warning,且该绑定键与交换机(Exchange)进行了绑定

1.1.4、Q2

  1. 队列(消费者监听此队列)
  2. 指定了绑定键(BindingKey)为warning,info,且该绑定键与交换机(Exchange)进行了绑定

1.1.5、Q3

  1. 队列(消费者监听此队列)
  2. 指定了绑定键(BindingKey)为debug、info,且该绑定键与交换机(Exchange)进行了绑定

1.2、生产者处理流程

声明队列并声明交换机 -> 创建连接 -> 创建通道 -> 通道声明交换机 -> 通道声明队列 -> 通过通道使队列绑定到交换机并指定该队列的routingkey(通配符) -> 制定消息 -> 发送消息并指定routingkey(通配符)

1.3、生消费者处理流程

声明队列并声明交换机 -> 创建连接 -> 创建通道 -> 通道声明交换机 -> 通道声明队列 -> 通过通道使队列绑定到交换机并指定routingkey(通配符) -> 重写消息消费方法 -> 执行消息方法

1.4、举例

  1. 该交换机的类型为direct,生产
  2. 如果生产者发送一条消息,如果在发送消息时,设置路由键为 warning
    1. 消息会路由到 Q1、Q2
  3. 如果生产者发送一条消息,如果在发送消息时,设置路由键为 info
    1. 消息会路由到 Q2、Q3
  4. 如果生产者发送一条消息,如果在发送消息时,设置路由键为 debug
    1. 消息会路由到 Q3

2、MQ实现

2.1、创建队列

direct_queue1
direct_queue2
direct_queue3

在这里插入图片描述

2.2、新建一个交换机

  1. 新建一个交换机
  2. 类型为 direct
direct_exchange

在这里插入图片描述

在这里插入图片描述

2.3、绑定交换机与队列的关系

  1. 绑定时,明确绑定键 BindingKey
direct_queue1
direct_queue2
direct_queue3
warning
info
debug

在这里插入图片描述

最终效果

在这里插入图片描述

2.4、在交换机 direct_exchange 中发送消息

  1. 需要指定一个路由键

在这里插入图片描述

2.5、查看消息

上述的路由键为"warning",则会收到的队列有:direct_queue1、direct_queue2

在这里插入图片描述

3、代码实现

3.1、代码结构

在这里插入图片描述

3.2、生产者

3.2.1、相对于工作队列模式

  1. 交换机类型不同
    1. 工作队列模式的交换机类型为 默认的交换机
    2. 路由模式的交换机类型为 direct
  2. 给交换机发送消息时,指定了一个路由键 RountingKey

3.2.2、代码

package com.example.rabbitmq03.business.test5;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

public class Producer {
    
    private static final String DIRECT_EXCHANGE_NAME = "code_direct_exchange";
    
    public static void main(String[] args) throws Exception {
        // 1. 获取连接
        Connection connection = RabbitMqUtil.getConnection("生产者");
        
        // 2. 通过连接获取通道 Channel
        Channel channel = connection.createChannel();
        
        // 3. 通过通道声明交换机,以及交换机类型为 direct
        
        /**
         * @param1:交换机名称
         * @param2:交换机的类型。常见的有:fanout、direct、topic
         * @param3:durable:设置是否持久化。设置为 true,表示持久化。持久化可以将交换机存盘,在服务器重启的时候不会丢失相关信息
         * @param4:autoDelete:设置是否自动删除。 设置为true,表示自动删除。自动删除的前提是至少有一个队列或者交换机与这个交换机绑定,之后所有与这个交换机绑定的队列或者交换机都与此解绑
         * @param5:internal:设置是否内置。设置为 true,则表示是内置的交换机。客户端程序无法直接发送消息到这个交换机中,只能通过交换器路由到交换机这种方式
         * @param6:其它一些结构化参数
         */
        
        // declareOk 用来标识成功声明了一个交换机。
        AMQP.Exchange.DeclareOk declareOk = channel.exchangeDeclare(DIRECT_EXCHANGE_NAME, "direct", false, false, false,
                null);
        // 4. 消息内容
        String message = "Hello   direct   warning";
        String routingKey = "warning";
        // 5. 发送消息到交换机,并指定路由键 RoutingKey 为 warning
        channel.basicPublish(DIRECT_EXCHANGE_NAME, routingKey, null, message.getBytes());
        System.out.println("消息发送完成~~~发送的消息为:" + message);
        // 6. 关闭信道、连接
        RabbitMqUtil.close(connection, channel);
    }
}


3.3、消费者

3.3.1、相对于工作队列模式

  1. Consumer 绑定队列和交换机,指定了1个绑定键 BindingKey
  2. Consumer2 绑定队列和交换机,指定了2个绑定键 BindingKey

3.3.2、代码

package com.example.rabbitmq03.business.test5;

import java.io.IOException;

import com.rabbitmq.client.*;

public class Consumer {
    
    private static final String DIRECT_QUEUE_NAME = "direct_queue1";
    private static final String DIRECT_EXCHANGE_NAME = "code_direct_exchange";
    
    public static void main(String[] args) throws Exception {
        // 获取连接
        Connection connection = RabbitMqUtil.getConnection("消费者");
        // 获取通道
        Channel channel = connection.createChannel();
        
        // 绑定队列到交换机
        // param1:队列名称
        // param2:交换机名称
        // param3:绑定键
        // param4:定义绑定时的一些参数
        channel.queueBind(DIRECT_QUEUE_NAME, DIRECT_EXCHANGE_NAME, "warning", null);
        
        // 定义消费者
        com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                    byte[] body) throws IOException {
                // body 消息体
                String msg = new String(body, "utf-8");
                System.out.println("收到消息:" + msg);
            }
        };
        
        // 监听队列
        channel.basicConsume(DIRECT_QUEUE_NAME, true, consumer);
        
        System.out.println("开始接收消息~~~");
        System.in.read();
        // 关闭信道、连接
        RabbitMqUtil.close(connection, channel);
    }
}


package com.example.rabbitmq03.business.test5;

import java.io.IOException;

import com.rabbitmq.client.*;

public class Consumer2 {
    
    private static final String DIRECT_QUEUE_NAME = "direct_queue2";
    private static final String DIRECT_EXCHANGE_NAME = "code_direct_exchange";
    
    public static void main(String[] args) throws Exception {
        // 获取连接
        Connection connection = RabbitMqUtil.getConnection("消费者");
        // 获取通道
        Channel channel = connection.createChannel();
        String bindingKey = "warning";
        String bindingKey2 = "info";
        // 绑定队列到交换机,并指定一个绑定键 BindingKey
        channel.queueBind(DIRECT_QUEUE_NAME, DIRECT_EXCHANGE_NAME, bindingKey);
        channel.queueBind(DIRECT_QUEUE_NAME, DIRECT_EXCHANGE_NAME, bindingKey2);
        
        // 定义消费者
        com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                    byte[] body) throws IOException {
                // body 消息体
                String msg = new String(body, "utf-8");
                System.out.println("收到消息:" + msg);
            }
        };
        
        // 监听队列
        channel.basicConsume(DIRECT_QUEUE_NAME, true, consumer);
        
        System.out.println("开始接收消息~~~");
        System.in.read();
        // 关闭信道、连接
        RabbitMqUtil.close(connection, channel);
    }
}


3.4、测试

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RabbitMQ--基础--7.4--工作模式--路由模式(Direct) 的相关文章

随机推荐

  • 机器学习好伙伴之scikit-learn的使用——datasets获得数据集

    机器学习好伙伴之scikit learn的使用 datasets获得数据集 载入sklearn中自带的datesets 利用sklearn的函数生成数据 应用示例 利用sklearn中自带的datesets进行训练 利用sklearn中生成
  • 使用ASMD 来描述硬件电路并辅助verilog 代码的编写

    TOC 使用ASMD 来描述硬件电路并辅助verilog 代码的编写 ASMD 的定义 ASM 算法状态机 图是描述时序状态机的一种抽象 类似于软件流程图 描述状态机的动作 但是ASM 图只显示控制信号和行为动作 控制状态 不显示存储元件所
  • 详谈redis之有序集合(ZSET)

    一 前言 有序集合存储着成员 member 和分值 score 的键值对 按照分值从小到大自动排序 具体细节在第一篇blog 详谈redis数据结构 中 不太熟悉的同学可以回去查看 对Java不太熟悉的同学可关注文章末尾的公众号 里面满满干
  • uniapp小程序的苹果 ios页面左右或上下滑动问题的解决方法效果damo(整理)

    一般来说 微信小程序的页面是不需要左右滑动的 甚至说是不允许左右滑动的 事实上 安卓手机在默认情况下就是左右不滑动的 但苹果IOS手机默认是左右可滑动的 其解决方法如下 在具体页面的顶级view元素设置class page 其CSS样式如下
  • eclipse中建动态web项目

    1 eclipse环境下配置tomcat 2 建项目 这就是一个建好的项目 3 将项目部署在tomcat服务器中 这个时候你的项目就部署在服务器上了
  • k8s 控制器:Replicaset 和 Deployment

    Deployment 官方文档 https kubernetes io docs concepts workloads controllers deployment k8s 在定义 pod 资源时 可以直接创建一个 kind Pod 类型的
  • 漫画告诉你:区块链到底是什么?

    区块链到底是什么 一幅漫画让你秒懂 区块链技术是指一种全民参与记账的方式 所有的系统背后都有一个数据库 你可以把数据库看成是就是一个大账本 目前是各自记各自的账 由于没有中心化的中介机构存在 让所有的东西都通过预先设定的程序自动运行 不仅能
  • JAVA垃圾分类网站计算机毕业设计Mybatis+系统+数据库+调试部署

    JAVA垃圾分类网站计算机毕业设计Mybatis 系统 数据库 调试部署 JAVA垃圾分类网站计算机毕业设计Mybatis 系统 数据库 调试部署 本源码技术栈 项目架构 B S架构 开发语言 Java语言 开发软件 idea eclips
  • 第一篇 香橙派刷机和开发环境准备(ubuntu20.04版)

    目录 一 香橙派刷ubuntu系统和SSH登录 1 Ubuntu有趣的Codename 2 刷机步骤 ubuntu20 04 格式化TF卡 烧写系统到TF卡 调试串口登陆系统 SSH登陆系统 二 开发环境准备 1 香橙派ubuntu20 0
  • “宝藏”,实用网站整理 - 持续更新ing

    文章目录 一 编程类 1 在线编程工具 1 ideone com 2 Octave Online 3 Anycodes 在线编程 2 编程刷题网站 1 LeetCode 2 牛客网 二 在线工具类 1 菜鸟工具 2 在线工具 程序员的工具箱
  • P2P原理以及如何实现(整理)

    前言 这几天看了p2p的原理以及实现的demo 整理一下 一共分为三部分 第一是概念原理 第二是demo实现 第三是p2p协议相关以及分类 一 概念原理 比较全面的理解 https zhuanlan zhihu com p 30351943
  • 地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法

    原文 WGS 84 到 GCJ 02 的转换 即 GPS 加偏 算法是一个普通青年轻易无法接触到的 公开 的秘密 这个算法的代码在互联网上是公开的 详情请使用 Google 搜索 wgtochina lb 整理后的算法代码请参考 https
  • 什么是外包公司?要不要去外包公司?

    01 什么是软件外包 软件外包分为 人力外包和项目外包两个方向 1 1 劳务派遣 指的是把员工外派到对应的用工企业打 短工 比如很多工程师虽然签约了中软国际 东软 文思海辉 软通动力 润和等软件公司 但实际工作地点是在华为 接受华为员相关负
  • c语言还有用吗?

    c语言还有用吗 这个问题有很多人在问 c语言真的没用吗 答案是有用的 用处还很大呢 这门语言虽然是很早以前发明的 新兴语言如c vb 功能十分强大 但每一个能代替C语言 原因 C
  • 【MySQL-约束篇】

    目录 1 空值 Null 2 默认值 3 主键 4 自增 5 唯一键 6 外键 1 空值 Null 先看一个表结构 Field Type Null Key Default Extra id int 11 YES NULL name
  • Java Long类型的查询结果与前端TypeScript显示不一致,后端传值与前端对不上,出现精度损失

    自己折腾了一个项目 使用的技术是SpringBoot MP Vben admin MySql 今天瞎搞的时候发现了一个让我很懵逼的问题 如下图所示 上方是浏览器打印出来的log 下方是数据库实际存在的数据 或者也可以说是后台接口断点调试的数
  • 电赛猜题?我觉得没用,还不如做好这些!

    01 前言 大家好 我是张巧龙 转眼又到22年电赛 这个公众号上有很多同学可能都参加过电赛 有毕业的已经工作的 也有没毕业的今年要参加 我第一次接触电赛是在大一暑期 从参加电赛到指导学生参加电赛 转眼快十年了 20年省赛有6个省一等奖 21
  • 2021-04-09

    jar 自动装配 springboot帮我们配置了什么 xxxxAutoConfiguration 向容器中自动装配组件 xxxxProperties 自动装配类 装配配置文件中自定义的一些内容 要 导入静态资源 首页 jsp 装配扩展Sp
  • ubuntu安装llvm教程

    安装必要工具 sudo apt get install build essential sudo apt get install cmake sudo apt get install python3 8 安装llvm wget https
  • RabbitMQ--基础--7.4--工作模式--路由模式(Direct)

    RabbitMQ 基础 7 4 工作模式 路由模式 Direct 代码位置 https gitee com DanShenGuiZu learnDemo tree master rabbitMq learn rabbitMq 03 1 介绍