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


    创建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.确认消息

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

    • 检查队列和消息是否存在
    • 把消息从硬盘、消息集合、待确认消息集合删除
      在这里插入图片描述
  • 相关阅读:
    java报告:小不点超市售货系统类图设计
    自然资源-做好用地用海国土空间规划符合性审查
    windows频繁更新问题解决方案
    MAUI候选版本3发布啦
    一键式AI绘画,让你也能体验当画师的魅力(附原理分析)
    人工智能知识全面讲解:梯度下降法
    skywalking9.2.0源码修改
    开源MyBatisGenerator组件源码分析
    “蔚来杯“2022牛客暑期多校训练营(加赛)J题题解
    使用栈数据结构进行全排序
  • 原文地址:https://blog.csdn.net/m0_71690645/article/details/132599589