当前位置: 首页 > news >正文

基于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.lryc.cn/news/154445.html

相关文章:

  • Hadoop的概述与安装
  • 进程、线程与构造方法
  • 04 Linux补充|C/C++
  • 利用python制作AI图片优化工具
  • React v6(仅支持函数组件,不支持类组件)与v5版本路由使用详情和区别(详细版)
  • (数字图像处理MATLAB+Python)第十二章图像编码-第一、二节:图像编码基本理论和无损编码
  • 【Unity编辑器扩展】| 顶部菜单栏扩展 MenuItem
  • golang读取键盘功能按键输入
  • 用sklearn实现线性回归和岭回归
  • 结构型模式-桥接模式
  • 缓存的放置时间和删除时间
  • 内网穿透实战应用-如何通过内网穿透实现远程发送个人本地搭建的hMailServer的邮件服务
  • ensp基础命令大全(华为设备命令)
  • thinkphp6 入门(4)--数据库操作 增删改查
  • MyBatisPlus 基础实现(一)
  • jmeter 计数器Counter
  • OpenCV(十九):模板匹配
  • 【iOS】Category、Extension和关联对象
  • 支持向量机(一)
  • MyBatis中至关重要的关系映射----全方面介绍
  • 47、TCP的流量控制
  • 密码学入门——环游密码世界
  • 笔记本家庭版本win11上win+r,运行cmd默认没有管理员权限,如何调整为有管理员权限的
  • MavenCentral库发布记录
  • 小程序进阶-env(safe-area-inset-bottom)的使用
  • 移动端App持续集成体系构建实战
  • Mybatis的关联关系配置一对一,一对多,多对多的映射关系
  • 计算机竞赛 基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类
  • 时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测
  • [Rust GUI]0.10.0版本iced代码示例 - progress_bar