浅谈如何自我实现一个消息队列服务器(2)——实现 broker server 服务器

一、实现 broker server 服务器

上次我们提到生产者-消费者模型中,最重要的是实现broker server(服务器模块)。 为什么最重要的是实现 broker server 呢?broker server 作为一个通用服务器,它可以给任何具有数据存储、转发需求的客户端服务器使用。就像现在的数据库程序一样,不论开发者实现什么业务,只要该业务中涉及数据的持久化存储,就需要使用数据库。

broker server 中管理着许多重要的概念(虚拟主机、交换机、队列、消息、绑定),这些概念的数据组织是实现 broker server 的关键。我们 以 如何使用代码实现一个 broker server 为核心,对 broker server 的实现进行详细介绍。

1.1 创建一个SpringBoot项目

之前的博客有介绍过如何使用IDEA创建一个 SpringBoot 项目,可以点击此处链接浅谈如何创建一个SpringBoot项目进行学习。

创建好一个SpringBoot项目之后,我们在pom.xml文件中引入SQLite的依赖,
在这里插入图片描述

再在配置文件application.yaml中针对SQLite、MyBatis的使用进行配置。

在这里插入图片描述

1.2 创建Java类

我们为 broker server 的实现创建一个包mqServer(这只是一个包名,可以自己随意进行自定义):
在这里插入图片描述

再在mqServer包下创建一个core包,core包里存放交换机、队列、消息、绑定这些概念的实体类:
在这里插入图片描述
交换机类(Exchange):
在这里插入图片描述

/*
 * 这个类表示一个交换机
 */
public class Exchange {
   
   
    // 此处使用 name 来作为交换机的身份标识. (唯一的)
    private String name;
    // 交换机类型, DIRECT, FANOUT, TOPIC
    private ExchangeType type = ExchangeType.DIRECT;
    // 该交换机是否要持久化存储. true 表示需要持久化; false 表示不必持久化.
    private boolean durable = false;
    // 如果当前交换机, 没人使用了, 就会自动被删除.
    // 这个属性暂时先列在这里, 后续的代码中并没有真的实现这个自动删除功能~~ (RabbitMQ 是有的)
    private boolean autoDelete = false;
    // arguments 表示的是创建交换机时指定的一些额外的参数选项. 后续代码中并没有真的实现对应的功能, 先列出来. (RabbitMQ 也是有的)
    // 为了把这个 arguments 存到数据库中, 就需要把 Map 转成 json 格式的字符串.
    private Map<String, Object> arguments = new HashMap<>();

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

    // 这里的 get set 用于和数据库交互使用.
    public String getArguments() {
   
   
        // 是把当前的 arguments 参数, 从 Map 转成 String (JSON)
        ObjectMapper objectMapper = new ObjectMapper();
        try {
   
   
            return objectMapper.writeValueAsString(arguments);
        } catch (JsonProcessingException e) {
   
   
            e.printStackTrace();
        }
        // 如果代码真异常了, 返回一个空的 json 字符串就 ok
        return "{}";
    }

    // 这个方法, 是从数据库读数据之后, 构造 Exchange 对象, 会自动调用到
    public void setArguments(String argumentsJson) {
   
   
        // 把参数中的 argumentsJson 按照 JSON 格式解析, 转成
        // 上述的 Map 对象
        ObjectMapper objectMapper = new ObjectMapper();
        try {
   
   
            this.arguments = objectMapper.readValue(argumentsJson, new TypeReference<HashMap<String, Object>>() {
   
   });
        } catch (JsonProcessingException e) {
   
   
            e.printStackTrace();
        }
    }

    // 在这里针对 arguments, 再提供一组 getter setter , 用来去更方便的获取/设置这里的键值对.
    // 这一组在 java 代码内部使用 (比如测试的时候)
    public Object getArguments(String key) {
   
   
        return arguments.get(key);
    }

    public void setArguments(String key, Object value) {
   
   
        arguments.put(key, value);
    }

    public void setArguments(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值