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

这篇具有很好参考价值的文章主要介绍了项目实战 — 消息队列(2){创建核心类}。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

 一、创建项目

二、创建核心类

🍅 1、 编写交换机类,Exchange

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

🍅 3、编写绑定类,binding

🍅 4、编写消息,Message


 一、创建项目

项目实战 — 消息队列(2){创建核心类},项目,java,开发语言

 项目实战 — 消息队列(2){创建核心类},项目,java,开发语言

二、创建核心类

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

项目实战 — 消息队列(2){创建核心类},项目,java,开发语言

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

项目实战 — 消息队列(2){创建核心类},项目,java,开发语言

项目实战 — 消息队列(2){创建核心类},项目,java,开发语言

主要是以下几个类

* 交换机 exchange

* 队列 queue

* 绑定 binding 

* 消息message

项目实战 — 消息队列(2){创建核心类},项目,java,开发语言


🍅 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 type = 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;
    
}

        * 正文部分

        ​​​​项目实战 — 消息队列(2){创建核心类},项目,java,开发语言

/*
* 表示一个要传递的消息
* 主要包含两个部分,一个属性部分,一个正文部分
* 属性部分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 getMessageId(){
        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);
    }
}

2023-7-31

修改:binding类中,exchangename => exchangeName

 2023-8-06

修改:Message类中,getMessage() => getMessageId()文章来源地址https://www.toymoban.com/news/detail-618971.html

到了这里,关于项目实战 — 消息队列(2){创建核心类}的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 项目实战 — 消息队列(1) {需求分析}

    目录 一、什么是消息队列 二、需求分析 🍅1、核心概念  🍅2、核心API 🍅3、交换机类型 🍅 4、持久化 🍅5、网络通信  🍅6、应答模式 三、模块划分 四、测试用例设计 五、总结 消息队列(Message Queue ,MQ),就是将阻塞队列的数据结构,提取成了一个程序,独立进行部署。

    2024年02月15日
    浏览(28)
  • 项目实战 — 消息队列(5){统一硬盘操作}

    前面已经使用数据库管理了交换机、绑定、队列,然后又使用了数据文件管理了消息。 那么,这里就创建一个类,讲之前的两个部分整合起来,对上层提供统一的一套接口,表示硬盘上存储的所有的类的信息。  创建了这个类,我们就不用去直接调用DataBaseManager和MessageFile

    2024年02月14日
    浏览(40)
  • 项目实战 — 消息队列(8){网络通信设计①}

    目录 一、自定义应用层协议 🍅 1、格式定义 🍅 2、准备工作 🎄定义请求和响应   🎄 定义BasicArguments 🎄 定义BasicReturns 🍅 2、创建参数类         🎄 交换机         🎄 队列         🎄 绑定         🎄发布消息         🎄 订阅消息         🎄确认应答

    2024年02月13日
    浏览(31)
  • 【项目实战】SpringBoot整合Kafka消息队列(基于KafkaTemplate和@KafkaListener实现)

    Apache Kafka是分布式发布-订阅消息系统。 它最初由LinkedIn公司开发,之后成为Apache项目的一部分。 Kafka是一种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务。 Apache Kafka与传统消息系统相比,有以下不同: 它将消息持久化到磁盘,因此可用于批量消

    2023年04月09日
    浏览(31)
  • 【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列

    Docker中安装 下载镜像: docker pull rabbitmq:management 创建实例并启动: 4369 – erlang发现口 5672 --client端通信口 15672 – 管理界面ui端口 25672 – server间内部通信口 在web浏览器中输入地址:http://服务器ip:15672/ 输入默认账号: guest : guest overview :概览 connections :无论生产者还是消费者

    2024年02月12日
    浏览(36)
  • Java开发 - 消息队列之RabbitMQ初体验

    目录 前言 RabbitMQ 什么是RabbitMQ RabbitMQ特点 安装启动 RabbitMQ和Kafka的消息收发区别 RabbitMQ使用案例 添加依赖 添加配置 创建RabbitMQ配置类 RabbitMQ消息的发送 RabbitMQ消息的接收 测试 结语 前一篇,我们学习了Kafka的基本使用,这一篇,我们来学习RabbitMQ。他们作为消息队列本身都具

    2024年02月03日
    浏览(32)
  • Kafka消息队列核心概念以及部署

    2023年06月29日
    浏览(39)
  • 架构核心技术之分布式消息队列

    Java全能学习+面试指南:https://javaxiaobear.cn 今天我们来学习分布式消息队列,分布式消息队列的知识结构如下图。 主要介绍以下内容: 同步架构和异步架构的区别。异步架构的主要组成部分:消息生产者、消息消费者、分布式消息队列。异步架构的两种主要模型:点对点模型

    2024年02月07日
    浏览(33)
  • 消息队列-RabbitMQ:MQ作用分类、RabbitMQ核心概念及消息生产消费调试

    1)什么是 MQ MQ (message queue),从字面意思上看, 本质是个队列,FIFO 先入先出 ,只不过队列中存放的内容是 message 而已,还是一种 跨进程的通信机制 , 用于上下游传递消息 。在互联网架构中,MQ 是一种非常常见的上下游 “ 逻辑解耦 + 物理解耦” 的消息通信服务 。 使用了

    2024年02月20日
    浏览(33)
  • 【图解RabbitMQ-3】消息队列RabbitMQ介绍及核心流程

    🧑‍💻作者名称:DaenCode 🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开发。技术尚浅,闭关学习中······ 😎人生感悟:尝尽人生百味,方知世间冷暖。

    2024年02月09日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包