RocketMq源码解析(7)

RocketMq源码解析 (七)


这一期将会详细讲解关于Broker对消费者的底层管理,以及一些常见操作的底层实现

brokerController

    private final ConsumerOffsetManager consumerOffsetManager;
    private final ConsumerManager consumerManager;

这两个类就是关于消费者管理的类了,其中的关系比较复杂,先上类图在这里插入图片描述

设计模式

模板方法

这里有几个关键点,首先就是ConfigManagerConsumerOffsetManager,先上源码

ConfigManager和ConsumerOffsetManager
import common.constant.LoggerName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;

/**
 * @author xuxiaoxi10
 * @version 1.0
 * @date 2020/4/2 21:38
 */
public abstract class ConfigManager {
   
    private static final Logger PLOG= LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);

    public abstract String encode();

    /**
     * 配置文件路径
     * @return 配置文件路径
     */
    public abstract String configFilePath();
    public boolean load(){
   
        String fileName = null;
        try {
   
            fileName = this.configFilePath();
            String jsonString = MixAll.file2String(fileName);

            if (null == jsonString || jsonString.length() == 0) {
   
                return this.loadBak();
            } else {
   
                this.decode(jsonString);
                PLOG.info("load {} OK", fileName);
                return true;
            }
        } catch (Exception e) {
   
            PLOG.error("load " + fileName + " Failed, and try to load backup file", e);
            return this.loadBak();
        }
    }

    private boolean loadBak(){
   
        String fileName = null;
        try {
   
            fileName = this.configFilePath();
            String jsonString = MixAll.file2String(fileName + ".bak");
            if (jsonString != null && jsonString.length() > 0) {
   
                this.decode(jsonString);
                PLOG.info("load " + fileName + " OK");
                return true;
            }
        } catch (Exception e) {
   
            PLOG.error("load " + fileName + " Failed", e);
            return false;
        }

        return true;
    }

    /**
     * 解码
     */
    public abstract void decode(final String jsonString);

    public synchronized void persist() {
   
        String jsonString = this.encode(true);
        if (jsonString != null) {
   
            String fileName = this.configFilePath();
            try {
   
                MixAll.string2File(jsonString, fileName);
            } catch (IOException e) {
   
                PLOG.error("persist file Exception, " + fileName, e);
            }
        }
    }
    public abstract String encode(final boolean prettyFormat);
}

不难看出这是模板方法模式的模板,模板方法,顾名思义就是定义一个操作的算法框架,而将一些步骤延迟到子类中,这样子类可以不改变算法的结构即可重定义算法的某些特定步骤。而这个类就是配置管理的类,其用于各种不同的类的配置管理,包括文件解码,文件编码,配置文件路径,加载配置文件,加载备份文件,而在这个方法中定义好的方法是加载配置文件,加载备份文件,配置文件持久化,这的确是每个类的配置管理器要做的事情,至于怎么解码,解码哪个文件,编码哪个文件就是具体的子类要实现的了,再讲子类ConsumerOffsetManager之前我们先来了解一下几个底层类,因为这个类都用到了这几个底层类。

支持类

在这里插入图片描述
这几个则是底层一些的支持类,比如订阅消息数据,客户端通道信息,消费者信息,消费组信息,在我们分析完后,相信你能理解其中的一些底层架构方式

SubscriptionData

public class SubscriptionData implements Comparable<SubscriptionData> {
   
    public final static String SUB_ALL="*";
    //是否启用消息过滤机制
    private boolean classFilterMode=false;
    //订阅节点
    private String topic;
    //具体节点
    private String subString;
    //标签
    private Set<String> tagsSet = new HashSet<String>();
    //编码
    private Set<Integer> codeSet = new HashSet<Integer>();
    //版本控制
    private long subVersion = System.currentTimeMillis();

    @JSONField(serialize = false)
    private String filterClassSource;

    public SubscriptionData(){
   

    }
    public SubscriptionData(String topic,String subString)<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值