mq基础类设计

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

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

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

解耦合:就是在分布式系统中,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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Window系统搭建feishu-chatgpt企业AI机器人并实现无公网ip远程连接

文章目录 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 在飞书中创建chatGPT机器人并且对话&#xff0c;在下面操作步骤中…

偶现bug如何分析和处理?

测试中比较郁闷的一件事就是遇到偶现bug。测个10次~20次才难得出来一次&#xff0c;甚至有时几天才会出现一次&#xff0c;真的去复现的时候又不记得自己执行了哪些步骤。所以遇到这样的问题都是比较头疼的。 举个例子&#xff1a; 打开一个论坛&#xff0c;有一个在线人数的信…

在Mac上安装nginx+rtmp 本地服务器

需要使用终端命令&#xff0c;如果没有Homebrew&#xff0c;要安装Homebrew,执行&#xff1a; ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 一、安装Nginx 1、先clone Nginx项目到本地&#xff1a; brew tap de…

云计算,用价格让利换创新空间?

文 | 智能相对论 作者 | 李源 ECS&#xff08;云服务器&#xff09;最高降36%、OSS&#xff08;对象存储&#xff09;最高降55%、RDS&#xff08;云数据库&#xff09;最高降40%…… 阿里云惊人的降幅&#xff0c;一次性把国内云计算厂商的价格战推到了白热化阶段。 这次能…

【C语言】linux内核napi_gro_receive

一、注释 // napi_gro_receive是网络设备接口的一个函数&#xff0c;它被NAPI&#xff08;New API&#xff09;网络轮询机制使用&#xff0c;用于接收和处理接收到的数据包。 // 这个函数通过通用接收分组&#xff08;GRO&#xff0c;Generic Receive Offload&#xff09;技术…

java数据结构与算法刷题-----LeetCode687. 最长同值路径

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 深度优先&#xff0c;用下面的儿子判断2. 深度优先&#xff0…

UE4 Niagara 关卡3.4官方案例解析

Texture sampling is only supported on the GPU at the moment.(纹理采样目前仅在GPU上受支持) 效果&#xff1a;textures can be referenced within GPU particle systems。this demo maps a texture to a grid of particles&#xff08;纹理可以在GPU粒子系统中被引用这个演…

【3GPP】【核心网】【5G】5G核心网协议解析(二)(超详细)

5G UE 附着过程 UE AMF ----------------- 注册请求(Registration Request) ----------------------> <--------------- 鉴权请求(Authentication Request) ------…

折线图实现柱状阴影背景的demo

这个是一个由官网的基础折线图实现的流程&#xff0c;将涉及到的知识点附上个人浅薄的见解&#xff0c;源码在最后&#xff0c;需要的可自取。 折线图 成果展示代码注解参数backgroundColordataZoomlegendtitlexAxisyAxisgridseries 源码 成果展示 官网的基础折线图&#xff…

BetterDisplay Pro for Mac v2.0.11激活版:屏幕显示优化专家

BetterDisplay Pro是一款由waydabber开发的Mac平台上的显示器校准软件&#xff0c;可以帮助用户调整显示器的颜色和亮度&#xff0c;以获得更加真实、清晰和舒适的视觉体验。 软件下载&#xff1a;BetterDisplay Pro for Mac v2.0.11激活版下载 &#x1f50d; 精准校准&#xf…

[HackMyVM]靶场 Quick3

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (U…

【触想智能】工业一体机刷卡应用知识分享

工业一体机刷卡技术是一种高效、稳定、安全的身份认证方式&#xff0c;具有广泛的应用场景和优势。在工业自动化控制、生产过程监测等领域&#xff0c;它已成为必不可少的设备之一。 一、工业一体机刷卡的原理:工业一体机刷卡的原理和普通的刷卡设备类似&#xff0c;都是通过读…

3.1_2024ctf青少年比赛部分web题

php后门 根据x-powered-by知道php的版本 该版本存在漏洞&#xff1a; PHP 8.1.0-dev 开发版本后门 根据报错信息&#xff0c;进行提示&#xff0c;前 GET / HTTP/1.1 Host: challenge.qsnctf.com:31639 User-Agentt:12345678system(cat /flag);var_dump(2*3);zerodium12345678…

QChart柱状图

//柱状图// 创建柱状图数据QBarSet *set0 new QBarSet("");*set0 << 1601 << 974 << 655 << 362;QBarSeries *series new QBarSeries();series->append(set0);set0->setColor(QColor("#F5834B"));// 创建柱状图QChart *ch…

高校校园点餐系统|基于B/S结构+ Mysql+Java+JSP技术的高校校园点餐系统平台设计与实现(源码+数据库+文档+PPT)

目录 摘 要 数据库设计 用户信息实体图 食堂信息实体图 留言板信息实体图 数据库表设计 系统详细设计 前台首页功能模块 管理员功能模块 食堂功能模块 用户功能模块 论文参考 文末获取源码联系 摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff…

STM 32 HAL库 UART 调试的问题

问题1&#xff1a;STM32G0 系列 DMA中断接收&#xff0c;应用层无法接收到数据 分析&#xff1a; Debug发现&#xff0c;最终没有进入串口中断函数 。 于是&#xff0c;检查Stm32CubeMX 的工程配置 两个串口的全局中断没有使能。 解决&#xff1a;勾选上图中红框部分&#x…

docker 常用命令大全(基础、镜像、容器、数据卷)

文章目录 1.docker基础命令2.docker镜像命令2.1 镜像名称2.2 镜像命令2.3 案例1--拉取、查看镜像2.4 案例2--保存、导入镜像 3.docker容器命令3.1 容器命令3.2 案例--创建并运行一个容器3.3 案例--进入容器&#xff0c;修改文件3.4 小结 4.数据卷4.1 什么是数据卷4.2 数据卷操作…

【Android】位置修改相关

获取位置服务总开关状态 //获取LOCATION_MODE值&#xff0c;但adb状态下无法获取 //0为关闭&#xff0c;1 gps、2 network、3 高精度等 int state Settings.Secure.getInt(mContext.getContentResolver(),Settings.Secure.LOCATION_MODE,Settings.Secure.LOCATION_MODE_HIGH_…

Netty(1)nio

一. NIO 基础 non-blocking io 非阻塞 IO 1. 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c;可以从 channel 将数据读入 buffer&#xff0c;也可以将 buffer 的数据写入 channel&#xff0c;而之前的 st…

多平台拼音输入法软件的开发

拼音输入法从上个世纪发展到现在, 已经发展了几十年了, 技术上已经非常成熟了. 换句话说, 就是实际上没多少技术含量, 随便来个人就能手搓一个. 本文介绍一个简单的多平台拼音输入法软件的设计和实现, 支持 GNU/Linux (ibus) 平台 (PC) 和 Android 平台 (手机). 目录 1 中文输…