项目实战 — 消息队列(2){创建核心类}

news2024/11/16 0:04:37

目录

 一、创建项目

二、创建核心类

🍅 1、 编写交换机类,Exchange

🍅 2、编写存储消息的队列,MSGQueue

🍅 3、编写绑定类,binding

🍅 4、编写消息,Message


 一、创建项目

 

二、创建核心类

代码解释主要在注释上面,注意一下注释

核心类主要是在服务器模块中的。 

主要是以下几个类

* 交换机 exchange

* 队列 queue

* 绑定 binding 

* 消息message


🍅 1、 编写交换机类,Exchange

首先编写一个交换机类型的类,ExchangeType

是一个枚举类型。

public enum ExchangeType {
    DIRECT(0),
    FANOUT(1),
    TOPIC(2);
    private final int type;

    private ExchangeType(int type){
        this.type = type;
    }
}

下面我这里直接用了Lombok的@Data组合注解注解代替了getter和setter方法,不了解的可以直接generate生产getter和setter方法,然后

关于Lombok不理解的可以参考SpringBoot日志文件_‍️藿香正气水的博客-CSDN博客,使用需要另外在pom.xml文件添加Lombok依赖

/*
* 表示一个交换机
* */
@Data
public class Exchange {
//    此处使用name,来作为交换机的身份标识(是唯一的)
    private String name;
//    交换机类型:DIRECT,FANOUT,TOPIC
//    使用枚举类型来表示
    private ExchangeType exchangeType = ExchangeType.DIRECT;

//    表示该交换机是否要持久化存储,true表示需要持久化;false表示不必持久化
//    有的数据是需要持久化存储的,有的不要。所以设置一个开关,
//    用户在使用的时候就可以选择是否真的需要持久化操作
    private boolean durable = false;
}

🍅 2、编写存储消息的队列,MSGQueue

/*
 * 表示一个存储消息的队列
 * MSG => Message
 * */
public class MSGQueue {
//    表示队列的身份标识
    private String name;
//    标识队列是否持久化,true标识持久化保存,false标识不持久化
    private boolean durable;
}

🍅 3、编写绑定类,binding

/*
* 表示队列和交换机之间的关联关系
* */
@Data
public class Binding {
//    binding依附于Exchange和Queue
//    binding和交换机和队列有关,所以就需要定义这两个name
    private String exchangename;
    private String queueName;

//    bindingKey,匹配了才能绑定
    private String bindingKey;
}

🍅 4、编写消息,Message

 主要包含两个部分:

        * 属性部分

                关于属性部分,创建一个BasicProperties类,编写message的属性:

                        关于三种交换机机型,参考项目实战 — 消息队列(1) {需求分析}_‍️藿香正气水的博客-CSDN博客

@Data
public class BasicProperties {
//    消息的唯一身份标识,
//    此处要保证id唯一性,使用UUID来作为messageif
    private String messageId;
//    消息上带有的内容,和bindingKey做匹配
//    如果当前的交换机型是DIRECT,此时roitingkey就标识要转发的队列名
//    如果当前的交换机型是FANOUT,此时roitingkey就无意义
//    如果当前的交换机型是TOPIC,此时roitingkey就要和bindingKey做匹配,符合要求才能转发
    private String routingKey;

//    这个属性表示消息是否要持久化,1标识不持久化 ,2标识持久化
    private int deliverMode = 1;
    
}

        * 正文部分

        ​​​​

/*
* 表示一个要传递的消息
* 主要包含两个部分,一个属性部分,一个正文部分
* 属性部分BasicProperties
* 正文部分byte[]
* * 此处的Message是需要能够在网络中传输的,还要写入到文件中
 * 所以需要针对Message进行序列化和反序列化,使用标准库自带的序列化/反序列化操作
* */
@Data
public class Message implements Serializable {  //实现该接口,就能实现序列化/反序列化,不需要重写其中的任何方法
    private BasicProperties basicProperties;
    private byte[] body;

//    下面是辅助性属性
//    Message后续会存储到文件中(持久化)
//    一个文件中会存储很多消息,
//    消息的具体位置使用下面的两个偏移量来进行表示
//    [offsetBegin,offsetEnd)
//    这两个属性,主要是为了让内存中的Message对象,能够快速的找到对应的硬盘上的Message的位置
//    所以并不需要被序列化保存到文件中,该消息一旦被写入到文件之后,所有消息就固定了,并不需要被单独存储
//    加上transient这两个属性就不会被序列化
    private transient long offsetBegin = 0;   //消息数据的开头距离文件开头的位置偏移(字节)
    private transient long offsetEnd = 0;     //消息数据的结尾距离文件开始的位置偏移(字节)

//    使用这个属性表示该消息在文件中是否是有效的消息(逻辑删除)
//    0x1表示有效,0x0表示无效
//    逻辑删除就是,删除数据不是真的删除,而是把需要删除的信息标记成无效
    private byte  isValid = 0x1;

//      创建一个工厂方法,让工厂方法帮我们封装以下Message对象的过程
//    该方法创建的Message对象,会自动生成唯一的MessageId
//    如果routingKey和basicProperties里面的routingKey冲突,以外面的为主
    public static  Message createMessageWithId(String routingKey,BasicProperties basicProperties,byte[] body){
        Message message = new Message();
        if(basicProperties != null){
            message.setBasicProperties(basicProperties);
        }
//        此处生成的MessageId以M-作为前缀
//        为了和后续别的uid进行区分
        message.setMessageId("M-"+ UUID.randomUUID());
        message.basicProperties.setRoutingKey(routingKey);
        message.body = body;

//        此处主要是把消息和body和属性设置出来,是Message的核心内容
//        其他的offsetBegin等是在消息持久化的时候才会用到
        return message;
    }


//    下面设置一些getter和Setter方法拿到
    public String getMessage(){
        return basicProperties.getMessageId();
    }

    public void setMessageId(String messageId){
        basicProperties.setMessageId(messageId);
    }

//    routingKey让消息和bindingKey做匹配
    public String getRoutingKey(){
        return basicProperties.getRoutingKey();
    }

    public void setRoutingKey(String routingKey){
        basicProperties.setRoutingKey(routingKey);
    }

//    deliverMode是为了判断该消息是否要持久化
    public int getDeliverMode(){
        return basicProperties.getDeliverMode();
    }

    public void setDeliverMode(int mode){
        basicProperties.setDeliverMode(mode);
    }
}

 

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

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

相关文章

【Golang 接口自动化04】 解析接口返回JSON串

目录 前言 解析到结构体 json数据与struct字段是如何相匹配的呢? 解析到interface Go类型和JSON类型 实例代码 simpleJson 总结 资料获取方法 前言 上一次我们一起学习了如何解析接口返回的XML数据,这一次我们一起来学习JSON的解析方法。 JSO…

Mysql 索引失效

1、模糊查询%在前面,无法排序所以失效 2、函数计算 3、表达式计算length(NAME) 4、隐式转换 5、联合索引非最左匹配 6、or 必须都为索引列 事务特性 (来自小林coding 事务隔离级别是怎么实现的? | 小林coding (xiaolincoding.com)&#…

基于Open3D的点云处理13-分割

平面分割(基于RANSAC) 使用RANSAC算法从点云中拟合平面; 接口:segment_plane 测试:Plane-segmentation import open3d as o3dpcd_point_cloud o3d.data.PCDPointCloud() pcd o3d.io.read_point_cloud(pcd_point_cl…

从零开始学Docker(二):启动第一个Docker容器

宿主机环境:RockyLinux 9 这个章节不小心搞成命令学习了,后面在整理成原理吧 Docker生命周期 拉取并启动Nginx容器 # 查找镜像 例如:nginx [root192 ~]# docker search nginx 我们可以看到,第一个时官方认证构建的nginx # 拉…

beego通过gorm访问mysql数据库

一、下载golang 二、解压下载包到C盘 三、配置golang系统环境变量 四、进入新建的工作目录C:\project下载并安装beego 五、将新生成的bee.exe所在的路径c:\project\bin加入到系统变量path里面 六、下载并安装mysql 例如在上图中, 选“No thanks,just start my down…

iOS开发-实现上下翻转轮播循环信息播报效果

iOS开发-实现上下翻转轮播循环信息播报效果 在开发中经常遇到需要实现轮播信息播报,例如以下效果 一、使用UITableView实现展示列表 UITableView 定义UITableView的实例,并让当前视图遵守UITableView的两个协议 property (nonatomic, weak, nullable)…

【Linux多线程】线程的互斥与同步(附抢票案例代码+讲解)

线程的互斥与同步 💫 概念引入⭐️临界资源(Critical Resource):🌟临界区(Critical Section):✨互斥(Mutex): ⚡️结合代码看互斥☄️ 代码逻辑&a…

无涯教程-jQuery - Progressbar组件函数

小部件进度条功能可与JqueryUI中的小部件一起使用。一个简单的进度条显示有关进度的信息。一个简单的进度条如下所示。 Progressbar - 语法 $( "#progressbar" ).progressbar({value: 37 }); Progressbar - 示例 以下是显示进度条用法的简单示例- <!doctype …

appium的基本使用

appium的基本使用 一、appium的基本使用appium环境安装1、安装Android SDK 2、安装Appium3、安装手机模拟器4、Pycharm安装 appium-python-alicent5、连接appium和模拟器6、Python代码调用appium软件&#xff0c;appium软件在通过adb命令调用android操作系统&#xff08;模拟器…

如何在局域网外SSH远程访问连接到家里的树莓派?

文章目录 如何在局域网外SSH远程访问连接到家里的树莓派&#xff1f;如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar4.2 cpolar进行token认证4.3 配置cpol…

详解Mybatis之分页插件【PageHelper】

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 文章目录 一. 什么是分页&#xff1f;二. 为什么使用分页&#xff1f;三. 如何设计一个Page类&#xff08;分…

【Python】Web学习笔记_flask(1)——getpost

flask提供的request请求对象可以实现获取url或表单中的字段值 GET请求 从URL中获取name、age两个参数 from flask import Flask,url_for,redirect,requestappFlask(__name__)app.route(/) def index():namerequest.args.get(name)agerequest.args.get(age)messagef姓名:{nam…

玩转LaTeX(四)【文献引入、自命令】

参考文献BibTeX: 使用最原始的文献导入&#xff1a;&#xff08;正文区&#xff09; \begin{document}%参考文献bibtex %一次管理一次使用 %参考文献格式&#xff1a; %\begin{thebibliography}{编号样本} % \bibitem[记号]{引用标志}文献条目1 % \b…

Java 程序员:本是为了跳槽刷完 1000 道真题,想不到被老板知道直接给我升职

同事&#xff1a;前阵子听说你要跳槽&#xff0c;现在准备得怎么样啊&#xff1f; 程序员 T&#xff1a;不跳了 同事&#xff1a;啊&#xff1f;为什么&#xff1f; 程序员 T&#xff1a;涨薪了呗&#xff1f; 同事&#xff1a;真的吗&#xff1f;涨了多少&#xff1f;你自…

IT类技术面试:从小白到高手的进阶指南

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

ElasticSearch基础篇-Java API操作

ElasticSearch基础-Java API操作 演示代码 创建连接 POM依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…

golang interface类型的nil

golang中interface变量&#xff0c;底层两个对象来存&#xff0c;一个是type、一个是value&#xff0c;只有type、value都为nil时&#xff0c;interface变量才是nil package mainimport ("fmt""reflect" )type People interface {Show() }type Student str…

(杭电多校)2023“钉耙编程”中国大学生算法设计超级联赛(4)

1003 Simple Set Problem 双指针的思想,双端队列 先从小到大排个序 一个一个放到双端队列里,一边放一边维护集合个数为k个 利用滑动窗口,当滑动窗口中集合个数为k时,只需算出滑动窗口最后一个数减去第一个数,然后每次取min就行了 AC代码&#xff1a; #include<iostream>…

电子元器件选型与实战应用—专栏介绍

文章目录 背景专栏内容专栏特色学习收获适用人群 背景 大家好&#xff0c;我是记得诚。 我新开了一个专栏&#xff0c;名字叫《电子元器件选型与实战应用》&#xff0c;选取20个最常用的电子元器件。 这是一个只讲如何选型&#xff0c;在实际电路中如何应用的专栏。 作为硬…

软考A计划-系统集成项目管理工程师-项目采购管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…