mq基础类设计

news2024/9/23 7:34:01

消息队列就是把阻塞队列这样的数据结构单独提取成一个程序独立进行部署。——>实现生产者消费者模型。

但是阻塞队列是在一个进程内部进行的;

消息队列是在进程与进程之间进行实现的, 

解耦合:就是在分布式系统中,A服务器调用B服务器,A给B发送请求,B给A返回响应,A和B之间耦合性很大。引入消息队列后,A把请求发给消息队列,B再从消息队列获取请求。

削峰填谷:B接收,A传送过多,B会感受到峰值,而B的硬盘之类资源有限,有消息队列,B仍然可以按照原本速度进行接收数据。不至于太多的并发量。

broker中间人负责转发和存储,mq和消费者的工作模式主要有两种,

推:push,Broker把收到的消息主动发出。

核⼼概念 • ⽣产者 (Producer) • 消费者 (Consumer) • 中间⼈ (Broker) • 发布 (Publish) • 订阅 (Subscribe)

 

package com.example.mq.mqserver.core;

import javax.websocket.RemoteEndpoint;
import java.io.Serializable;
import java.util.UUID;

/**Message包含正文和属性两个核心部分;
 *其中basicproperties基本特性包含routingkey,与Binding类中的bindingkey相对应;
 *in the end,创建工厂方法协助我们去创建Message对象:
 * */

/**对于message:需要支持序列化;将对象转变为字节流方便网络传输或者存储。
 * 可能会进行网络传输或者持久化存储;
 *
 * json中本质存储文本了理性的数据;
 * 而这里的Message存储二进制数据;
 * 标准库自带的方式进行序列化可以!
 *需要被序列化的类需要实现特定的接口;之前我们实现一个接口就是为了重写里面的某个或者某些方法。
 * 但是offsetEnd,offsetBeg是不需要序列化到保存在文件中的;因为消息一旦写入文件中位置就已经固定了;
 * so,transient暂住的,临时的;保证不背序列化
 * **/

/**硬盘存储:数据库  或者内存
 * mysql是客户端服务器结构的程序,SQLite(轻量级)是一个本地数据库,这个数据库相当于直接操作本地的硬盘文件;
 *在java中想要使用SQLite,就直接使用maven,将SQLite的依赖引入·,如果想额外安装SQLite也可以,下载就是一个dll/exe;
 *
 * 轻量级SQLLite
 * */
public class Message implements Serializable {
    private BasicPropertities basicPropertities=new BasicPropertities();
    private byte[] body;

    private transient long offsetBeg=0;//begin,消息的开头距文件的偏移;【)transient暂住的,临时的;保证不背序列化
    private transient long offsetEnd=0;//消息结尾距离文件开头的文件偏移;【)


    /**消息内容的存储需要持久化,硬盘对这个的处理就是存储在文件中。
     * 后续就是一个文件中存储很多消息;而如何在一个文件中找到我们想要的消息?
     * 就是使用偏移量,offsetBeg和offsetEnd;
     * */

    private byte isValid=0x1;
    /**是否是有效消息:
     *
     * 删除数据通常是逻辑删除,只是把它标记成无效而不是真正进行物理上的删除;
     *0x1有效,0x0无效;
     * 在硬盘操作使用byte更好一点;
     * */
    public  String getMessageId(){
        return basicPropertities.getMessageId();
    }
    public void setMessageId(String MessageId){
        basicPropertities.setMessageId(MessageId);
    }
    public String getRoutingKey(){
        return basicPropertities.getRoutingkey();
    }
    public void setRoutingKey(String routingKey){
        basicPropertities.setRoutingkey(routingKey);
    }
    public int getDeliverMode(){
        return basicPropertities.getDeliverMode();
    }
    public void setDeliverMode(int mode){
        basicPropertities.setDeliverMode(mode);

    }
    public BasicPropertities getBasicPropertities() {
        return basicPropertities;
    }

    public void setBasicPropertities(BasicPropertities basicPropertities) {
        this.basicPropertities = basicPropertities;
    }

    public byte[] getBody() {
        return body;
    }

    public void setBody(byte[] body) {
        this.body = body;
    }

    public long getOffsetBeg() {
        return offsetBeg;
    }

    public void setOffsetBeg(long offsetBeg) {
        this.offsetBeg = offsetBeg;
    }

    public long getOffsetEnd() {
        return offsetEnd;
    }

    public void setOffsetEnd(long offsetEnd) {
        this.offsetEnd = offsetEnd;
    }

    public byte getIsValid() {
        return isValid;
    }

    public void setIsValid(byte isValid) {
        this.isValid = isValid;
    }


    /**
     * 创建工厂方法协助我们去创建Message对象:
     *创建的message会帮助我们创建一个唯一的message id;
     * 这也是使用工厂方法而不是构造方法的原因之一。
     *
     * 函数里面放message的核心内容,basicproperties和body,
     * 这里是在内存中设置这些属性,而offsetEnd,offsetBeg是在持久化才。
     *
     * */
    public static Message createMessageWithId(String routingKey, BasicPropertities basicPropertities,byte[] body){
        Message message=new Message();
        if(basicPropertities!=null){
            message.setBasicPropertities(basicPropertities);
        }
        message.setMessageId("M-"+UUID.randomUUID());//前缀
        message.basicPropertities.setRoutingkey(routingKey);
        message.body=body;
        return message;
    }
}
package com.example.mq.mqserver.core;

import java.util.HashMap;
import java.util.Map;

public class MSGQueue {
    private String name;//唯一的身份标识;
     private boolean durable=false;
     private boolean exclusive=false;
     //如果为true,表示这个队列只能被一个消费者使用;
    //如果是false,表示这个队列可以被大家都使用;
    private boolean autodelete=false;
    private Map<String,Object> arguments=new HashMap<>();
    //其它的选项,可以有。


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isDurable() {
        return durable;
    }

    public void setDurable(boolean durable) {
        this.durable = durable;
    }

    public boolean isExclusive() {
        return exclusive;
    }

    public void setExclusive(boolean exclusive) {
        this.exclusive = exclusive;
    }

    public boolean isAutodelete() {
        return autodelete;
    }

    public void setAutodelete(boolean autodelete) {
        this.autodelete = autodelete;
    }

    public Map<String, Object> getArguments() {
        return arguments;
    }

    public void setArguments(Map<String, Object> arguments) {
        this.arguments = arguments;
    }
}
package com.example.mq.mqserver.core;

public enum ExchangeType {
    DIRECT(0),
    FANOUT(1),
    TOPIC(2);
    private final int  type;
    private ExchangeType(int type){
        this.type=type;
    }
    public int getType(){
        return type;
    }



}
package com.example.mq.mqserver.core;

/**
 * 描述队列与交换机之间的关联关系
 * Binding依附于交换机和队列
 * 所以如果交换机和队列都没有持久化,对Binding进行持久化是没有任何意义的。
 * */
public class Binding {
    private String exchangName;
    private String queueName;
    private String bindingKey;//routingkey,口令红包;

    public String getExchangName() {
        return exchangName;
    }

    public void setExchangName(String exchangName) {
        this.exchangName = exchangName;
    }

    public String getQueueName() {
        return queueName;
    }

    public void setQueueName(String queueName) {
        this.queueName = queueName;
    }

    public String getBindingKey() {
        return bindingKey;
    }

    public void setBindingKey(String bindingKey) {
        this.bindingKey = bindingKey;
    }
}
package com.example.mq.mqserver.core;

import java.util.HashMap;
import java.util.Map;

public class Exchange {
    private String name;//唯一标识
    //交换机的三种类型:direct,fanout,topic;
    private ExchangeType type=ExchangeType.DIRECT;
    private boolean durable=false;//是否需要持久化;shifalse不用
    /**
     * 内存存储:快速;
     * 硬盘存储:持久;
     * 对于交换机,队列,绑定,有些需要持久化有些不需要;
     * so,持久化的开关;
     *
     * */
    private boolean autoDelete=false;//没人使用就自动删除

    private Map<String,Object> arguments=new HashMap<>();
    //arguments表示创建交换机的时候指定的一些其它参数选项;
    //可以有也可以没有,用于开启不同的功能;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ExchangeType getType() {
        return type;
    }

    public void setType(ExchangeType type) {
        this.type = type;
    }

    public boolean isDurable() {
        return durable;
    }

    public void setDurable(boolean durable) {
        this.durable = durable;
    }

    public boolean isAutoDelete() {
        return autoDelete;
    }

    public void setAutoDelete(boolean autoDelete) {
        this.autoDelete = autoDelete;
    }

    public Map<String, Object> getArguments() {
        return arguments;
    }

    public void setArguments(Map<String, Object> arguments) {
        this.arguments = arguments;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RT-DETR优化改进:特征融合篇 | GELAN(广义高效层聚合网络)结构来自YOLOv9

🚀🚀🚀本文改进:使用GELAN改进架构引入到RT-DETR 🚀🚀🚀RT-DETR改进创新专栏:http://t.csdnimg.cn/vuQTz 🚀🚀🚀学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 🚀🚀🚀RT-DETR模型创新优化,涨点技巧分享,科研小助手; 1.YOLOv9介绍 论…

在用Java写算法的时候如何加快读写速度

对于解决该方法我们一般如下操作&#xff0c;不需要知道为什么&#xff0c;有模板&#xff08;个人观点&#xff09; 使用BufferedReader代替Scanner&#xff1a;Scanner类在读取大量输入时性能较差&#xff0c;而BufferedReader具有更高的读取速度。可以使用BufferedReader的r…

JVM的工作流程

目录 1.JVM 简介 2.JVM 执行流程 3. JVM 运行时数据区 3.1 堆&#xff08;线程共享&#xff09; 3.3 本地方法栈&#xff08;线程私有&#xff09; 3.4 程序计数器&#xff08;线程私有&#xff09; 3.5 方法区&#xff08;线程共享&#xff09; 4.JVM 类加载 ① 类…

webUI自动化之元素及浏览器操作

一、元素定位方式 1、元素属性定位&#xff1a; 1 element driver.find_element_by_id(self, id)    该类方法已经过时&#xff0c;新的方法如下&#xff1a; element driver.find_element(By.ID, ID 值)        # 用元素的 ID 属性定位element driver.find_eleme…

云打印软件免费版在哪?云打印服务怎么使用?

随着新的一年的到来&#xff0c;很多同学们又开始准备着新一轮的学习冲刺了。在学习的旅途中&#xff0c;打印资料的需求必然伴随着每一个人&#xff0c;但是线下打印店价格贵、打印不方便、没时间去打印等多种因素总是制约着我们。在这种情况下&#xff0c;云打印软件和云打印…

Svg Flow Editor 原生svg流程图编辑器(一)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; 效果展示 项目概述 svg flow editor 是一款流程图编辑器&#xff0c;提供了一系列流程图交互、编辑所必需的功能&#xff0c;支持前端研发自定义开发各种逻辑编排场景&#xff0c;如流程图、ER 图、…

【论文笔记】Scalable Diffusion Models with State Space Backbone

原文链接&#xff1a;https://arxiv.org/abs/2402.05608 1. 引言 主干网络是扩散模型发展的关键方面&#xff0c;其中基于CNN的U-Net&#xff08;下采样-跳跃连接-上采样&#xff09;和基于Transformer的结构&#xff08;使用自注意力替换采样块&#xff09;是代表性的例子。…

使用R语言进行聚类分析

一、样本数据描述 城镇居民人均消费支出水平包括食品、衣着、居住、生活用品及服务、通信、文教娱乐、医疗保健和其他用品及服务支出这八项指标来描述。表中列出了2016年我国分地区的城镇居民的人均消费支出的原始数据&#xff0c;数据来源于2017年的《中国统计年鉴》&#xf…

传递函数硬件化

已知一个系统的传递函数&#xff0c;如何进行硬件化呢&#xff1f; 只需要将传递函数离散化&#xff0c;得到差分方程&#xff0c;就可以根据差分方程进行硬件设计。 通过例子说明&#xff1a; 得到差分方程后&#xff0c;其中y(k)/y(k-1)/y(k-2)/u(k-1)/u(k-2)等代表不同周期…

【Spring】Spring状态机

1.什么是状态机 (1). 什么是状态 先来解释什么是“状态”&#xff08; State &#xff09;。现实事物是有不同状态的&#xff0c;例如一个自动门&#xff0c;就有 open 和 closed 两种状态。我们通常所说的状态机是有限状态机&#xff0c;也就是被描述的事物的状态的数量是有…

BC161 大吉大利,今晚吃鸡

一&#xff1a;题目 二&#xff1a;思路 三&#xff1a;代码 #include<bits/stdc.h>using namespace std;long long cnt;//柱子定义为x, y, z void move(int n, char x, char y, char z) {if(n 1){//printf("%c -> %c\n", x, y);//最大盘从x->y//prin…

git远程仓库分支推送与常见问题

1.查看远程仓库分支情况 git fetch origin git branch -r2.删除远程仓库中的某一分支(如master) git push origin --delete master问: 如果我的本地文件只有一个分支main,而远程仓库有两个分支Main和CubeMX, 若要将本地文件中新增的文件Test1.txt更改放入CubeMX中&#xff0c…

大数据开发-Hadoop分布式集群搭建

大数据开发-Hadoop分布式集群搭建 文章目录 大数据开发-Hadoop分布式集群搭建环境准备Hadoop配置启动Hadoop集群Hadoop客户端节点Hadoop客户端节点 环境准备 JDK1.8Hadoop3.X三台服务器 主节点需要启动namenode、secondary namenode、resource manager三个进程 从节点需要启动…

Linux操作系统项目上传Github代码仓库指南

文章目录 1 创建SSH key2.本地git的用户名和邮箱设置3.测试连接4.创建仓库5.终端项目上传 1 创建SSH key 1.登录github官网,点击个人头像,点击Settings,然后点击SSH and GPG keys,再点击New SSH key。 Title 可以随便取&#xff0c;但是 key 需要通过终端生成。 Linux终端执行…

窄带波束形成

阵列信号处理有以下三个研究方向&#xff1a; 检测入射信号是否存在&#xff0c;以及入射信号的数目检测入射信号的到达方向&#xff08;DOA)角增强某个感兴趣方向的信号&#xff0c;抑制其他方向的干扰&#xff08;beamforming) 波束形成&#xff08;beamforming&#xff09;…

福州·名城银河湾220㎡现代简约风装修案例分享。福州中宅装饰,福州装修

以手作维度构境, 跳脱约定成俗的风格, 转化内外地域分际, 于静谧中凝聚丰厚的美学能量, 谦虚且沉默以对。 平面设计图 项目信息 项目名称 | 名城银河湾 设计地址 | 福建福州 项目面积 | 220㎡ 项目户型 | 5室2厅2厨3卫 设计风格 | 现代轻奢 首席设计师丨欧阳光玉 中…

STM32 | STM32F407ZE(LED寄存器开发续第二天源码)

上节回顾 STM32 | STM32时钟分析、GPIO分析、寄存器地址查找、LED灯开发(第二天)STM32 | Proteus 8.6安装步骤(图文并茂)一、 LED灯开发 1、理解led灯原理图 LED0连接在PF9 PF9输出低电平(0),灯亮;PF9输出高电平(1),灯灭;(低电平有效) 2、打开GPIOF组时钟 //将…

随机输一次(Python3)

大家应该都会玩“锤子剪刀布”的游戏&#xff1a;两人同时给出手势&#xff0c;胜负规则如图所示&#xff1a; 现要求你编写一个控制赢面的程序&#xff0c;根据对方的出招&#xff0c;给出对应的赢招。但是&#xff01;为了不让对方意识到你在控制结果&#xff0c;你需要隔 K …

网络安全相关证书有哪些?

从事于信息安全工作的人们&#xff0c;在面对繁杂问题的时候&#xff0c;往往会有焦虑和烦躁的表现。一部分可能来自于系统和流程的实际漏洞&#xff0c;一方面可能是自身的能力还有部分短板。许多人认为庞杂的问题或多或少的难以下手&#xff0c;如果有好的方式能够同时解决这…

Linux报错排查-刚安装好的ubuntu系统无法ssh连接

Linux运维工具-ywtool 目录 一.问题描述二.问题解决2.1 先给ubuntu系统配置阿里云源2.2 安装openssh-server软件2.3 在尝试ssh连接,可以连接成功了 三.其他命令 一.问题描述 系统:ubuntu-18.04-desktop-amd64 系统安装完后,想要通过xshell软件连接系统,发现能Ping通系统的IP,但…