RabbitMQ系列(13)--Direct交换机的简介与实现

news2024/11/23 22:03:58

1、Direct交换机的介绍

Direct交换机能让消息只发送往绑定了指定routingkey的队列中去,值得注意的是当绑定多个队列的routingkey都相同,则这种情况下的表现与Fanout交换机的类似

2、Direct交换机的实现 

(1)新建一个名为fanout的包,用于装发布确认的代码

效果图:

(2)新建一个名为Receive01的类用于编写消费者的代码

代码如下:

 注:RabbitMqUtils工具类的实现在我的另一篇文章里,有需要的同学可以查看参考

RabbitMQ系列(6)--RabbitMQ模式之工作队列(Work queues)的简介及实现_Ken_1115的博客-CSDN博客

package com.ken.direct;

import com.ken.utils.RabbitMqUtils;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

/**
 * 消息接收
 */
public class Receive01 {

    //声明交换机的名称
    public static  final String EXCHANGE_NAME = "direct_exchange";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMqUtils.getChannel();

        //声明一个交换机
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);

        /**
         * 创建队列
         * 第一个参数:队列名称
         * 第二个参数:服务器重启后队列是否还存在,即队列是否持久化,true为是,false为否,默认false,即消息存储在内存中而不是硬盘中
         * 第三个参数:该队列是否只供一个消费者进行消费,是否进行消息共享,true为只允许一个消费者进行消费,false为允许多个消费者对队列进行消费,默认false
         * 第四个参数:是否自动删除,最后一个消费者断开连接后该队列是否自动删除,true自动删除,false不自动删除
         * 第五个参数:其他参数
         */
        channel.queueDeclare("console",false,false,false,null);
        //队列与交换机通过routingkey进行捆绑
        channel.queueBind("console",EXCHANGE_NAME,"info");
        //队列与交换机通过routingkey进行捆绑
        channel.queueBind("console",EXCHANGE_NAME,"warning");

        /**
         * 声明消费者接收消息后的回调方法(由于回调方法DeliverCallback是函数式接口,所以需要给DeliverCallback赋值一个函数,为了方便我们这里使用Lambda表达式进行赋值)
         * 为什么要这样写呢,是因为basicConsume方法里的参数deliverCallback的类型DeliverCallback用 @FunctionalInterface注解规定DeliverCallback是一个函数式接口,所以要往deliverCallback参数传的值要是一个函数
         *
         * 以下是DeliverCallback接口的源代码
         *  @FunctionalInterface
         *  public interface DeliverCallback {
         *      void handle (String consumerTag, Delivery message) throws IOException;
         *  }
         */
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            System.out.println("Receive01接收到的消息:" + new String(message.getBody(),"UTF-8"));
        };
        
        /**
         * 用信道对消息进行接收
         * 第一个参数:消费的是哪一个队列的消息
         * 第二个参数:消费成功后是否要自动应答,true代表自动应当,false代表手动应答
         * 第三个参数:消费者接收消息后的回调方法
         * 第四个参数:消费者取消接收消息后的回调方法(正常接收不调用)
         */
        channel.basicConsume("console",true,deliverCallback,consumerTag -> {});
    }

}

(3)复制Receive01类并粘贴重命名为Receive02

 代码如下:

package com.ken.direct;

import com.ken.utils.RabbitMqUtils;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

/**
 * 消息接收
 */
public class Receive02 {

    //声明交换机的名称
    public static  final String EXCHANGE_NAME = "direct_exchange";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMqUtils.getChannel();

        //声明一个交换机
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);

        /**
         * 创建队列
         * 第一个参数:队列名称
         * 第二个参数:服务器重启后队列是否还存在,即队列是否持久化,true为是,false为否,默认false,即消息存储在内存中而不是硬盘中
         * 第三个参数:该队列是否只供一个消费者进行消费,是否进行消息共享,true为只允许一个消费者进行消费,false为允许多个消费者对队列进行消费,默认false
         * 第四个参数:是否自动删除,最后一个消费者断开连接后该队列是否自动删除,true自动删除,false不自动删除
         * 第五个参数:其他参数
         */
        channel.queueDeclare("disk",false,false,false,null);
        //队列与交换机通过routingkey进行捆绑
        channel.queueBind("disk",EXCHANGE_NAME,"error");

        /**
         * 声明消费者接收消息后的回调方法(由于回调方法DeliverCallback是函数式接口,所以需要给DeliverCallback赋值一个函数,为了方便我们这里使用Lambda表达式进行赋值)
         * 为什么要这样写呢,是因为basicConsume方法里的参数deliverCallback的类型DeliverCallback用 @FunctionalInterface注解规定DeliverCallback是一个函数式接口,所以要往deliverCallback参数传的值要是一个函数
         *
         * 以下是DeliverCallback接口的源代码
         *  @FunctionalInterface
         *  public interface DeliverCallback {
         *      void handle (String consumerTag, Delivery message) throws IOException;
         *  }
         */
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            System.out.println("Receive01接收到的消息:" + new String(message.getBody(),"UTF-8"));
        };
        
        /**
         * 用信道对消息进行接收
         * 第一个参数:消费的是哪一个队列的消息
         * 第二个参数:消费成功后是否要自动应答,true代表自动应当,false代表手动应答
         * 第三个参数:消费者接收消息后的回调方法
         * 第四个参数:消费者取消接收消息后的回调方法(正常接收不调用)
         */
        channel.basicConsume("disk",true,deliverCallback,consumerTag -> {});
    }

}

(4)新建一个名为Direct的类用于编写生产者的代码

代码如下:

package com.ken.direct;

import com.ken.utils.RabbitMqUtils;
import com.rabbitmq.client.Channel;

import java.util.Scanner;

/**
 * 发消息
 */
public class Direct {

    //声明交换机的名称
    public static  final String EXCHANGE_NAME = "direct_exchange";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMqUtils.getChannel();
        //从控制台读取要发送的信息
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String message = scanner.next();
            /**
             * 用信道对消息进行发布
             * 第一个参数:发送到哪个交换机
             * 第二个参数:路由的Key值是哪个,本次是队列名
             * 第三个参数:其他参数信息
             * 第四个参数:发送消息的消息体
             */
            channel.basicPublish(EXCHANGE_NAME,"info",null,message.getBytes("UTF-8"));
            //channel.basicPublish(EXCHANGE_NAME,"warning",null,message.getBytes("UTF-8"));
            //channel.basicPublish(EXCHANGE_NAME,"error",null,message.getBytes("UTF-8"));
            System.out.println("生产者发送的消息:" + message);
        }

    }
    
}

 (5)分别先运行Receive01、Receive02

(6)先把Direct类里的routingkey设置为info,然后启动Direct类

例:

(7)在Direct里输入消息,然后查看Receive01和Receive02接收消息的情况,能看出Receive01接收到消息,而Receive02没有接收到消息

(8)把Direct类里的routingkey设置为warning,然后重新启动Direct类

(9)在Direct里输入消息,然后查看Receive01和Receive02接收消息的情况,能看出Receive01接收到消息,而Receive02没有接收到消息

(10)把Direct类里的routingkey设置为error,然后重新启动Direct类

(11)在Direct里输入消息,然后查看Receive01和Receive02接收消息的情况,能看出Receive01没有接收到消息,而Receive02接收到了消息

从上述众多结果可看出direct交换机实现成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/725531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT6在线下载安装慢的问题

由于某“墙”的原因,在国内安装QT是会要了老命的,下载只有几十K,安装QT6保守估计得按天计算了。 经过多次尝试,终于找到了可以“几十MB”速度下载安装的办法。 方法一: qt-unified-windows-x64-4.5.2-online.exe --…

leetcode:移动零

移动零 easy 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums […

回归预测 | MATLAB实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多输入单输出

回归预测 | MATLAB实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多输入单输出 目录 回归预测 | MATLAB实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多输入单输出预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多输入…

如何用深度强化学习自动炒股

初衷 最近一段时间,受到新冠疫情的影响,股市接连下跌,作为一棵小白菜兼小韭菜,竟然产生了抄底的大胆想法,拿出仅存的一点私房钱梭哈了一把。 第二天,暴跌,俺加仓 第三天,又跌&…

【PCL】(二)CMake编译

&#xff08;二&#xff09;CMake编译 将以下代码写到pcd_write.cpp中&#xff0c;并放到项目/PATH/TO/MY/GRAND/PROJECT/project中。 #include <iostream>#include <pcl/io/pcd_io.h>#include <pcl/point_types.h>intmain (){pcl::PointCloud<pcl::Poin…

黑马头条 作业+解答 day03-自媒体文章发布 自媒体接口

感觉是非常适合新手的练手接口&#xff1b;花了不到半小时吧&#xff0c;主要是因为接口描述很清晰&#xff01; 建议大家仔细自己做了一遍再对照&#xff0c;有更好的写法欢迎留言&#xff01; 1)素材管理 1.1)图片删除 接口描述 说明接口路径/api/v1/material/del_picture/{i…

分布式事务 微服务事务方案和实现 Java分布式事务架构知识点

文章目录 什么是分布式事务分布式的理论的角度看分布式事务的体系刚性事务&#xff1a;柔性事务&#xff1a;两段提交&#xff08;2PC&#xff09;两段提交&#xff08;2PC - Prepare & Commit&#xff09;是指两个阶段的提交&#xff1a;两段提交&#xff08;2PC&#xff…

这些ai自动生成图片软件你值得拥有

小明是一名设计师&#xff0c;最近他接到了一份海报设计的任务。但是&#xff0c;他却发现自己的设计能力有些瓶颈&#xff0c;无法满足客户的需求。就在他苦恼之时&#xff0c;他的朋友小王向他建议了了几款趁手的ai绘画工具&#xff0c;可以帮助它快速绘制出美轮美奂的图片。…

什么是 AOP?对于 Spring IoC 和 AOP 的理解?

什么是 AOP&#xff1f; AOP(Aspect-Oriented Programming)&#xff0c;即 面向切面编程&#xff0c; 它与OOP( ObjectOriented Programming, 面向对象编程) 相辅相成&#xff0c;提供了与OOP 不同的抽象软件结构的视角 在 OOP 中, 我们以类(class)作为我们的基本单元 而 A…

微服务网关SpringCloudGateway实战

目录 微服务网关SpringCloudGateway 1.概述 2.核心概念 快速入门 1.微服务开发 2.网关配置创建一个Gateway服务&#xff0c;引入以下依赖&#xff1a; 微服务网关SpringCloudGateway 1.概述 Spring cloud gateway是spring官方基于Spring 5.0、Spring Boot2.0和Project R…

K8S集群安全升级(CIS CNI Calico)

集群安全升级 1 集群安全升级1.1 环境安全1.1.1 CIS基础1.1.2 测试工具1.1.3 组件测试1.1.4 定制测试1.1.5 测试镜像 1.2 网络安全1.2.1 CNI方案1.2.2 Calico环境1.2.3 Calico部署1.2.4 简单实践1.2.5 BGP实践1.2.6 策略实践1.2.7 流量管控1.2.8 基准测试 1 集群安全升级 1.1 …

怎样成为平面设计师?一文带你快速了解

成为一名优秀的平面设计师需要具备一定的条件和能力&#xff0c;同时也需要与行业的发展趋势保持密切的联系。本文将深入探讨成为一名优秀的平面设计师所需的条件&#xff0c;帮助你成为一名优秀的平面设计师。 1、掌握平面设计工具 是否能熟练掌握设计工具和软件是成为优秀平…

物理层概述(一)

物理层基本概念 在计算机网络中&#xff0c;用来连接计算机的媒体大概可以分为两种&#xff1a; 1.导引型传输媒体 双绞线&#xff0c;同轴电缆&#xff0c;光纤 2.非导引型传输媒体 微波通信&#xff08;2~40GHz&#xff09; 物理层协议的主要任务&#xff1…

C++核心编程之引用的使用与介绍

目录 一、引用的基本语法 引用介绍 引用说明 二、引用的注意事项 三、引用做函数参数 四、引用做函数的返回值 五、引用的本质 六、常量引用 一、引用的基本语法 引用介绍 C是C语言的继承&#xff0c;它可进行过程化程序设计&#xff0c;又可以进行以抽象数据类型为特…

(Docker) Compose Plugin For OMV6

omv6:omv6_plugins:docker_compose [omv-extras.org] Summary概述 Docker is a technology that enables the creation and use of Linux containers. A container is a closed environment where one or more applications and their dependencies are installed, grouped and…

浏览器种输入一个url到显示页面全过程

所谓的‘三颗树’ 在浏览器中&#xff0c;当解析和加载网页时&#xff0c;会形成三个重要的树结构&#xff1a;DOM树、CSSOM树和渲染树&#xff08;Render Tree&#xff09;。这些树结构在网页的渲染和布局过程中起到关键作用。 DOM树&#xff08;Document Object Model Tree&…

亿发软件:释放智能仓储的力量,WMS智能仓储管理系统提升动态储存

在仓储管理领域&#xff0c;智能仓储的概念已经成为游戏规则的改变者。借助信息化、物联网和机电一体化的力量&#xff0c;智能仓库正在给行业带来变化。这些先进设施显著增加了仓储管理能力。在本文中&#xff0c;我们将探讨智能仓库的关键优势&#xff0c;了解采用WMS智能仓储…

【文生图系列】文生图大模型合集与效果对比

文章目录 DELL EDELL E 1DELL E 2 ERNIE-ViLGERNIE-ViLG 1ERNIE-ViLG 2Paddlehub ImagenMidjourneyStable DiffusionAltDiffusioneDiff-I阿里通义 DELL E DALLE到目前为止有两个版本&#xff0c;2021年1月&#xff0c;OpenAI发布了DALLE&#xff1b;2022年,DALLE 迎来了升…

Jersey框架学习

一、入门 controller package com.itheima.controller;import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType;Path("/person") public class PersonResource {GETProduces(MediaType.TEXT_PLAIN)pub…

【微笑女王-InsCode Stable Diffusion 美图活动一期】

文章目录 一、 Stable Diffusion 模型在线使用地址二、模型相关版本和参数配置三、图片生成提示词与反向提示词四、种子及对应图片 一、 Stable Diffusion 模型在线使用地址 https://inscode.csdn.net/inscode/Stable-Diffusion 操作步骤&#xff1a; 点击Stable Diffusion …