码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 基于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.确认消息

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

    • 检查队列和消息是否存在
    • 把消息从硬盘、消息集合、待确认消息集合删除
      在这里插入图片描述
  • 相关阅读:
    Real-Time Rendering——9.9.3 Smooth-Surface Subsurface Models光滑表面地下模型
    centos7安装mysql5.7步骤(图解版)
    Net6Configuration & Options 源码分析 Part3 IOptionsMonitor 是如何接收到配置文件变更并同步数据源的
    STM8应用笔记10.修改CPU的时钟
    微信小程序上传文件或图片(包含base64)至七牛云
    面试官:Go 有哪些方式安全读写共享变量
    为什么要用微前端?如何使用乾坤微前端?
    Spring Boot集成WebSocket以及基本使用
    SpringBoot+Mybatis-plus整合easyExcel批量导入Excel到数据库+导出Excel
    智慧导览|智能导游系统|AR景区导览系统|景区电子导览
  • 原文地址:https://blog.csdn.net/m0_71690645/article/details/132599589
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号