0
点赞
收藏
分享

微信扫一扫

JVM系列:垃圾回收器(GC)

捌柒陆壹 03-09 13:30 阅读 3

 

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;
    }
}
举报

相关推荐

0 条评论