2020_07_07 学习日记

本文详细解析了JmxCollector的工作原理,包括其构造方法、reloadConfig方法以及toSnakeAndLowerCase方法的功能与实现。同时,深入探讨了JmxMBeanPropertyCache的内部结构和作用,如PROPERTY_PATTERN的使用、keyPropertiesPerBean的存储机制及getKeyPropertyList和onlyKeepMBeans方法的执行逻辑。

早上:

        1、 照着抄同学的一个小练手的时候,看到他的代码里自定义异常类有个奇怪的 final long,问了他:原来异常类型还要带编号的。。。顺便百度了一下,然后还看到 实现 Serializable 的 应该有个  serialVersionUID  是为了增强版本迭代的鲁棒性,学到了学到了。

        2、同学的小练手被我匆匆抄了一遍,感觉,web肯定是还不太熟练的。主要是后面要把 timetable5.0 里面的知识吃下来就好了,哎,昨天玩了一天手机,亚历山大。我想要一天有48小时给我,我枯了。

下午:

JmxCollector 的个人解析:

1、继承自 Collector 类 ,Collector类是各类具体监控器(如Gauge、Counter)的父类,

  1. 里面有一个Describable接口,用List存储了各类信息,可以不实现,则会有一个默认的describable。
  2. Type也是里面的一个成员变量,类型是 enum ,记录的是子监控器类型名的样子,GAUGE、HISTOGRAM、UNTYPED等

2、有两个私有的静态内部类 Rule 和 Config。

3、JmxMBeanPropertyCache :该开源项目自己的类,用于存了一个 mBean 的mapping。 mBean 的 objectNames to key property lists。 主要目的是减少当我们找不到 mBeans 时调用 PROPERTY_PATTERN 的频率。

方法:

1、JmxCollector 的构造方法:

  1. 单传 File 是更新 config 。 (这一块提到的 config 的类型是上面提到的,私有的静态内部类)
  2. 单传String 类型的 yamlConfig 也是更新 config 。
  3. 单传一个 InputStream 也是更新 config 。

2、两个 reloadConfig 方法:

  1. 无参方法:根据持有的private File configFile 更新 config。 更新后会根据成功或失败记录log,并调用inc()方法将无标签的 counter 增 1。
  2. Map<String, Object> yamlConfig: 该方法会返回自己声明的 Config 。 后面一大串各种 if ,return 了一个内部新建的 Config

3、 static String toSnakeAndLowerCase(String attrName) 

  1. 传入参数为空则直接返回 attrName
  2. 将一个String类型的 变量名称 转换成一个 所有位小写,且驼峰命名的单词中间用下划线隔开的 String 。(即命名格式转换)
static String toSnakeAndLowerCase(String attrName) {
      if (attrName == null || attrName.isEmpty()) {
        return attrName;
      }
      // 取出首位
      char firstChar = attrName.subSequence(0, 1).charAt(0);
      // 字符是大写的或者下划线 则 为 true
      boolean prevCharIsUpperCaseOrUnderscore = Character.isUpperCase(firstChar) || firstChar == '_';
      // 新建了一个初始长度是和传入参数登场的StringBuilder,
      // 然后append了转成小写的传入参数的首位char
      StringBuilder resultBuilder = new StringBuilder(attrName.length()).append(Character.toLowerCase(firstChar));

      // 遍历传入 String 除开首位的部分
      for (char attrChar : attrName.substring(1).toCharArray()) {
        // 获取当前位是不是大写
        boolean charIsUpperCase = Character.isUpperCase(attrChar);
        if (!prevCharIsUpperCaseOrUnderscore && charIsUpperCase) {
          // 进来的条件为 首位(第一次)或 标志位(第二次及后续)
          // 不是 大写或下划线  且  当前遍历位为 大写字母 , 
          // 则 给结果 append 一个下划线
          resultBuilder.append("_");
        }
        // 当前位转小写 然后 append进来
        resultBuilder.append(Character.toLowerCase(attrChar));
        // 标志 boolean 赋值为 当前位是否大写 或 当前位是 下划线
        prevCharIsUpperCaseOrUnderscore = charIsUpperCase || attrChar == '_';
      }
      // StringBuilder 转 String
      return resultBuilder.toString();
  }

4、static String safeName(String name)  自带注释:将无效字符转成下划线并合并多个下划线 

      注意:如果开头是数字的话,会先 append 一个下划线进去

5、private static boolean isLegalCharacter(char input)  当传入的 char 为 : 或 _ 或 26个字母或数字,返回 true

6、一个内部类 Receiver 实现了 JmxScraper.MBeanReceiver 接口 (这个接口是项目里自己声明的)

 

JmxMBeanPropertyCache 的 个人解析:

1、private static final Pattern PROPERTY_PATTERN 这是一个规定好了的 Pattern,已经详尽地初始化完了

2、private final Map<ObjectName, LinkedHashMap<String, Stirng>> keyPropertiesPerBean;   自带的注释说:实现ObjectName的getKeyPropertyList的一个版本,它以添加属性的顺序返回属性(ObjectName以添加属性的顺序存储它们)。

        a) 一开始看见这有个 final 关键字还挺疑惑的,加了 final 还怎么用,后来明白了:final 只是不让修改 Map ,但我可以修改 Map 里面的东西。 

        b) Note: 一个 ObjectName 类型的键, 对应的是一个 完整的 LinkedHashMap, 即一个 map 而非 一个键值对

3、public LinkedHashMap<String, String> getKeyPropertyList(ObjectName mbeanName)  

      在这里,我去 jdk官方文档 看了一下 ObjectName 到底是个什么东西

      第一行说明: Represents the object name of an MBean, or a pattern that can match the names of several MBeans. Instances of this class are immutable.

      问了问同学,去搜了一下javax,然后又草草看了一篇 MBean 的博客。

     这个方法下面说实话没看懂返回了个啥,但大概就是用pattern去匹配了些

4、public void onlyKeepMBeans(Set<ObjectName> latestBeans)   这个是会在 keyPropertiesPerBean 中删除传入的 latestBeans 所没有的 ObjectName    (这个也没咋看懂)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值