基于RabbitMQ的模拟消息队列之五——虚拟主机设计

文章目录

      • 一、创建VirtualHost类
      • 二、初始化
      • 三、API
      • 1.创建交换机
      • 2.删除交换机
      • 3.创建队列
      • 4.删除队列
      • 5.创建绑定
      • 6.删除绑定
      • 7.发送消息
        • 转发规则
      • 8.订阅消息
        • 1.消费者管理
        • 2.推送消息给消费者
      • 3.添加一个消费者管理ConsumerManager
      • 9.确认消息

创建VirtualHost类。
1.串起内存和硬盘的数据。
2.通过在队列名、交换机名前面加上虚拟主机的名字来隔离不同组的业务。
3.实现API
4.实现转发规则

一、创建VirtualHost类

在这里插入图片描述

二、初始化

  • 初始化硬盘
  • 加载硬盘数据到内存
    在这里插入图片描述

三、API

1.创建交换机

  • 创建过了 return true
  • 没有创建过,创建
  • 先写硬盘、后写内存
    在这里插入图片描述

2.删除交换机

  • 检查交换机是否存在,不存在,抛异常
  • 存在,删除交换机
  • 先删硬盘、再删内存
    在这里插入图片描述

3.创建队列

  • 检查队列是否存在,存在,return true
  • 不存在,创建
  • 先写硬盘、再写内存
    在这里插入图片描述

4.删除队列

  • 检查队列是否存在,不存在,抛异常
  • 存在,删除队列
  • 先删硬盘、再删内存
    在这里插入图片描述

5.创建绑定

在这里插入图片描述

  • 检查绑定是否存在,存在,抛异常
  • 不存在,检查bindingKey是否合法,不合法,抛异常
  • 检查交换机和队列是否存在,不存在,抛异常
  • 存在,创建绑定
  • 先写硬盘,再写内存
    在这里插入图片描述

6.删除绑定

  • 检查绑定是否存在,不存在,抛异常
  • (省略检查)删除绑定
  • 先删硬盘、再删内存
    在这里插入图片描述

7.发送消息

  • 检查交换机是否存在,不存在,抛异常
  • 检查routingKey是否合法
  • 合法,根据交换机规则转发消息

DIRECT(直接交换机) 队列名就是routingKey,根据routingKey找对应的队列
FANOUT(扇出交换机)往交换机绑定的所有队列转发消息
TOPIC(主题交换机)遍历交换机绑定的所有队列,根据routingKey能匹配的上的bindingKey对应的队列

转发规则

  • 检查binfdingKey是否合法
    在这里插入图片描述
  • 检查routingKey是否合法
    在这里插入图片描述
  • 根据交换机类型匹配不同的转发规则
    在这里插入图片描述
  • 主题交换机的匹配规则
    在这里插入图片描述

=========================================

  • 发送消息
    1. 先写硬盘、再写内存
    2. 通知消费者可以消费数据了

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

8.订阅消息

  • 往指定队列添加订阅者(消费者),队列收到消息后推送消息给订阅者(消费者)

在这里插入图片描述

  • Consumer

一个函数式接口,用来实现回调函数。当队列收到消息后调用的。
服务器通过此接口,实现把消息推送给客户端
客户端通过此接口,实现收到消息后进行消费

在这里插入图片描述

1.消费者管理

  • 添加一个ConsumerEnv类,表示一个消费者。
    在这里插入图片描述

  • 在MSGQueue中添加一个属性 List,里面存放订阅了该队列的消费者。
    在这里插入图片描述

  • 实现添加消费者
    在这里插入图片描述

  • 以轮询的方式,挑选消费者
    在这里插入图片描述

2.推送消息给消费者

核心方法其实就是调用回调方法,但是为了调用次回调方法,需要做很多前期准备

  • 添加一个阻塞队列,当队列收到消息,把队列名添加到阻塞队列中(相当于令牌)
    (前面发送消息的时候,有一个通知消费者可以消费了,这个方法其实就是把队列名添加到阻塞队列中)
  • 添加一个扫描线程,不停的扫描阻塞队列,拿到令牌通知线程池执行回调
  • 挑选出对应队列的消费者,使用线程池执行回调方法,推送消息给该消费者

在这里插入图片描述

3.添加一个消费者管理ConsumerManager

管理消费者和推送消息给消费者的功能

  • 属性
    在这里插入图片描述

  • 往阻塞队列中添加队列名(发送消息的时候调用,通知消费者可以消费消息了)
    在这里插入图片描述

  • 往队列中添加订阅者(如果此时有消息了,需要立即消费掉)
    在这里插入图片描述

  • 扫描线程
    在这里插入图片描述

  • 推送消息给消费者

    1. 挑选消费者
    2. 从队列取出消息
    3. 线程池执行回调,在执行回调前,将消息放入待确认消息集合
    4. 如果是自动确认,需要在此时删除消息(把消息从硬盘、消息集合、待确认消息集合删除)
      在这里插入图片描述

9.确认消息

消费者收到消息后,调用次方法,手动确认收到消息。

  • 检查队列和消息是否存在
  • 把消息从硬盘、消息集合、待确认消息集合删除
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站用户体验之深度感悟

个性化定制界面和极简版原装界面,哪一个你用起来更加顺手呢,相比之下你更喜欢哪一个? 界面选择: (提醒:仅个人感悟。~~) 方向一:表明自己的喜好 我个人觉得更喜欢个性化定制界面。…

SI24R1/NRF24L01P引脚及软硬件中文开发资料

NRF24L01P芯片兼容通信。从而被打上了国产NRF24L01P的标签,更有甚者居然磨掉芯片原本的SI24R1的LOGO打成NRF24L01P,给很多客户产生了很多不必要的损失。大家定向的理解,国产的东西总是会比国外进口的相差到哪里哪里,如此云云。其实…

Flutter启动页

效果图 import dart:async; import package:flutter/cupertino.dart; import package:flutter/material.dart; import jumpPage.dart;class TransitPage extends StatefulWidget {const TransitPage({super.key});overrideState<TransitPage> createState() > _Trans…

git学习笔记 | 版本管理 - 分支管理

文章目录 git学习笔记Git是什么仓库常见的命令commit 备注规范在文件下设置git忽略文件 .gitignore 版本管理git log | git reflog 查看提交日志/历史版本版本穿梭 git resetgit reset HEAD <file> git checkout -- fileName 丢弃工作区的修改git revertGit恢复之前版本的…

Redis设置开机自启动

&#xff08;配置环境变量&#xff09;需要重启电脑 1、在安装目录打开命令行&#xff0c;输入&#xff1a;打开一个命令窗进入文件夹内&#xff0c;输入redis-server --service-install redis.windows-service.conf 2、windowsR ---->services.msc 找到Redis&#xff0c;右…

框架分析(9)-Hibernate

框架分析&#xff08;9&#xff09;-Hibernate 专栏介绍Hibernate特性对象关系映射&#xff08;ORM&#xff09;数据库连接和事务管理查询语言&#xff08;HQL&#xff09;缓存机制透明的持久化操作对象的延迟加载事务管理 优缺点优点简化数据库操作跨数据库平台高度可定制性缓…

技术深入解析与教程:网络安全技术探秘

第一章&#xff1a;引言 在当今数字化时代&#xff0c;网络安全已经成为了重要议题。随着各种信息和业务在网络上的传输与存储&#xff0c;安全问题也日益突出。本文将带您深入探讨网络安全领域中的关键技术&#xff0c;涵盖渗透测试、漏洞挖掘以及恶意软件分析等方面&#xf…

SolVES4.1学习1——安装与使用教程

1、下载并安装 SolVES 4版本是QGIS插件&#xff0c;但实际使用过程中发现在最新版的QGIS安装该插件过程中&#xff0c;会报错或异常。因此需安装特定版本的软件。共需安装如下图软件及Java环境等。 根据官方文档安装好后&#xff0c;可以进行相关操作。 2、设置QGIS环境 QG…

Redis的数据类型到底有什么奥秘

这里我们先只介绍五种常用的数据类型~ 目录 1、string 2、hash 3、list 4、set 5、zset 6、示例 1、string 数据类型&#xff1a;string内部编码&#xff1a;raw、int、embstr 说明&#xff1a; raw是最基本的字符串--底层是一个char数组&#xff08;此处的char是一个字…

阿里内部绝密资料——亿级并发系统架构设计(2023版)

俗话说&#xff1a;罗马不是一天建成的&#xff0c;系统的设计当然也是如此。 从原来谁都不看好的淘宝到现在的电商巨头&#xff0c;展现的不仅仅是一家互联网巨头的兴起&#xff0c;也是国内互联网行业迎来井喷式发展的历程&#xff0c;网络信号从 2G 发展到现在的 5G 通信&a…

07-ThreadLocal有哪些使用场景?【Java面试题总结】

ThreadLocal有哪些使用场景&#xff1f; 7.1 多线程场景下共享变量问题 ThreadLocal是线程本地变量&#xff0c;可以存储共享变量副本&#xff0c;每一个独立线程都有与共享变量一模一样的副本。ThreadLocal在当前线程下共享变量是全局共享的&#xff0c;各个线程之间是相互独…

Unity2D实现左右移动的敌人角色

文章目录 环境与角色创建敌人角色 敌人脚本检测前方是否有地面获取检测点检测地面 完整代码运行结果其他文章 环境与角色 创建敌人角色 简单起见&#xff0c;突出脚本的内容&#xff0c;我们就只创建一个圆形用来当做当前的敌人角色。 为分清左右&#xff0c;我们再为敌人角色…