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

这篇具有很好参考价值的文章主要介绍了基于RabbitMQ的模拟消息队列之五——虚拟主机设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、创建VirtualHost类

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

二、初始化

  • 初始化硬盘
  • 加载硬盘数据到内存
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

三、API

1.创建交换机

  • 创建过了 return true
  • 没有创建过,创建
  • 先写硬盘、后写内存
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

2.删除交换机

  • 检查交换机是否存在,不存在,抛异常
  • 存在,删除交换机
  • 先删硬盘、再删内存
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

3.创建队列

  • 检查队列是否存在,存在,return true
  • 不存在,创建
  • 先写硬盘、再写内存
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

4.删除队列

  • 检查队列是否存在,不存在,抛异常
  • 存在,删除队列
  • 先删硬盘、再删内存
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

5.创建绑定

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

  • 检查绑定是否存在,存在,抛异常
  • 不存在,检查bindingKey是否合法,不合法,抛异常
  • 检查交换机和队列是否存在,不存在,抛异常
  • 存在,创建绑定
  • 先写硬盘,再写内存
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

6.删除绑定

  • 检查绑定是否存在,不存在,抛异常
  • (省略检查)删除绑定
  • 先删硬盘、再删内存
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

7.发送消息

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

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

转发规则
  • 检查binfdingKey是否合法
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java
  • 检查routingKey是否合法
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java
  • 根据交换机类型匹配不同的转发规则
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java
  • 主题交换机的匹配规则
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

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

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

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

8.订阅消息

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

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

  • Consumer

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

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

1.消费者管理
  • 添加一个ConsumerEnv类,表示一个消费者。
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

  • 在MSGQueue中添加一个属性 List,里面存放订阅了该队列的消费者。
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

  • 实现添加消费者
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

  • 以轮询的方式,挑选消费者
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

2.推送消息给消费者

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

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

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

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

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

  • 属性
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

  • 往阻塞队列中添加队列名(发送消息的时候调用,通知消费者可以消费消息了)
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

  • 往队列中添加订阅者(如果此时有消息了,需要立即消费掉)
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

  • 扫描线程
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

  • 推送消息给消费者

    1. 挑选消费者
    2. 从队列取出消息
    3. 线程池执行回调,在执行回调前,将消息放入待确认消息集合
    4. 如果是自动确认,需要在此时删除消息(把消息从硬盘、消息集合、待确认消息集合删除)
      基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

9.确认消息

消费者收到消息后,调用次方法,手动确认收到消息。文章来源地址https://www.toymoban.com/news/detail-690051.html

  • 检查队列和消息是否存在
  • 把消息从硬盘、消息集合、待确认消息集合删除
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计,java-rabbitmq,rabbitmq,java

到了这里,关于基于RabbitMQ的模拟消息队列之五——虚拟主机设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于RabbitMQ的模拟消息队列之四——内存管理

    针对交换机、队列、绑定、消息、待确认消息设计数据结构。 交换机集合 exchangeMap 数据结构:ConcurrentHashMap key:交换机name value:交换机对象 队列集合 queueMap 数据结构: ConcurrentHashMap key:队列name value:队列对象 绑定集合 bindingsMap 数据结构: ConcurrentHashMap 嵌套 ConcurrentHashMap key

    2024年02月10日
    浏览(32)
  • 基于RabbitMQ的模拟消息队列之六——网络通信设计

    自定义基于TCP的应用层通信协议。实现客户端对服务器的远程调用 编写服务器及客户端代码 1.请求格式 type:哪个方法 length:payload的长度 payload:调用的方法的参数 2.创建Request类 1.响应格式 type:哪个方法 length:payload的长度 payload:调用的方法的结果 2.创建Response类 0X1 创建chann

    2024年02月09日
    浏览(35)
  • 基于RabbitMQ的模拟消息队列之三——硬盘数据管理

    1.设计数据库 交换机、队列、绑定是交给数据库来管理的,所以,设计这三个表结构就够了,表的字段和核心类同名。 2.添加sqlite依赖 3.配置application.properties文件 4.创建接口MetaMapper 在mqserver包下新创建一个包,名字为mapper,在此包下,创建一个接口MetaMapper。添加注解@Mappe

    2024年02月10日
    浏览(65)
  • 基于RabbitMQ的模拟消息队列之二---创建项目及核心类

    创建一个SpringBoot项目,环境:JDK8,添加依赖:Spring Web、MyBatis FrameWork(最主要) 2.核心类 在mqserver包中添加一个包,名字为core,表示核心类。 Exchange ExchangeType MSGQueue (为了区分Queue) Binding Message BasicProperties

    2024年02月11日
    浏览(37)
  • 模拟实现消息队列(以 RabbitMQ 为蓝本)

    核心概念1 生产者(Producer):生产者负责生成数据并将其放入缓冲区(队列)中。生产者可以是一个线程或多个线程,它们可以并行地生成数据。当缓冲区(队列)已满时,生产者需要等待,直到有空间可用。 消费者(Consumer):消费者负责从缓冲区(队列)中取出数据并进行处

    2024年02月13日
    浏览(53)
  • 手写消息队列(基于RabbitMQ)

    提到消息队列是否唤醒了你脑海深处的记忆?回看前面的这篇文章:《Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)》,其中我们在介绍阻塞队列时说过,阻塞队列最大的用途就是实现 生产者消费者模型 。 我们知道对于生产者消费者模型来说,它具有两个十分

    2024年02月05日
    浏览(30)
  • RabbitMQ 教你如何创建虚拟主机

    点击admin 后输入账号密码点击add user即可创建了一个新用户         创建好用户后就会在上方展示 在正常安装RabbitMQ之后, 系统会默认创建一个虚拟主机 名称以 / 的形式  点击Virtual Hosts 添加一个名为test的虚拟主机  添加成功后点击test这里我们为虚拟主机添加用户  点击权

    2023年04月20日
    浏览(33)
  • Spring RabbitMQ 配置多个虚拟主机(vhost)

    在日常开发中,同时需要用到RabbitMQ多个虚拟机(vhost)。应用场景:需要接收多个交换机的数据,而交换机都在不同的虚拟机(vhost) Docker安装RabbitMQ 【SpringCloud】整合RabbitMQ六大模式应用(入门到精通) 本地模拟发送、接收RabbitMQ数据

    2024年02月21日
    浏览(47)
  • SpringCloud-实现基于RabbitMQ的消息队列

    消息队列是现代分布式系统中常用的通信机制,用于在不同的服务之间传递消息。在Spring Cloud框架中,我们可以利用RabbitMQ实现强大而可靠的消息队列系统。本篇博客将详细介绍如何在Spring Cloud项目中集成RabbitMQ,并创建一个简单的消息队列。 这里是一个简单的RabbitMQ消息队列

    2024年03月11日
    浏览(43)
  • 3.RabbitMQ UI管理界面使用(用户、虚拟主机)

    RabbitMQ专栏目录(点击进入…) 1.服务方式 (1)打开服务 (2)在RabbitMQ Command Prompt中执行命令(方式一) 管理插件包含在RabbitMQ发行版中。与其他任何插件一样,必须先启用它才能使用它 (3)cmd执行命令(方式二) 因为在上面配置了RabbitMQ的sbin环境变量,所以在cmd中执行

    2024年02月05日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包