[seata]seataConfig.getProperty(dataId) 对于非 String 类型返回 null

2024-07-15 800 views
6

io.seata.config.consul.ConsulConfiguration#getLatestConfigio.seata.config.nacos.NacosConfiguration#getLatestConfig 在获取值先从 seataConfig 中获取

@Override
public String getLatestConfig(String dataId, String defaultValue, long timeoutMills) {
      String value = seataConfig.getProperty(dataId);
      if (value == null) {
          ConfigFuture configFuture = new ConfigFuture(dataId, defaultValue, ConfigFuture.ConfigOperation.GET,
                  timeoutMills);
          consulNotifierExecutor.execute(() -> complete(getConsulClient().getKVValue(dataId, getAclToken()), configFuture));
          value = (String) configFuture.get();
      }

      return value;
}

通过 java.util.Properties#getProperty(java.lang.String) 获取时,非 String 类型返回 null

public String getProperty(String key) {
        Object oval = map.get(key);
        String sval = (oval instanceof String) ? (String)oval : null;
        Properties defaults;
        return ((sval == null) && ((defaults = this.defaults) != null)) ? defaults.getProperty(key) : sval;
}

使用 consul,通过 seata.config.consul.key 指定 YAML 配置文件,不对每个 key 单独设置键值对,日志出现很多 ERROR 10624 --- [ main] io.seata.config.ConfigFuture : config operation timeout,cost:5022 ms,op:GET,dataId:service.disableGlobalTransaction 错误

非异常

对于非 String,如 Boolean,Integer 类型等能正常返回

使用 consul,通过 seata.config.consul.key 指定 YAML 配置文件,将https://seata.io/zh-cn/docs/user/configuration/consul.html中提到的默认配置放在这一个 key 中,不对每个 key 单独设置键值对

  • JDK version : 11
  • Seata version: 1.5.1
  • OS : Windows 11
  • Others: consul:1.12.2

回答

0

这里本身读取的就是string的value,后续给出去才会转换成其他类型,这说明你配置里没有对应的key=value,你可以debug先看下seataConfig里到底有没有这个key

7

这里读取到 key 对应的值之后会根据配置的数据类型转换成 Properies 类对象,也就是 seataConfig,debug 可以看到seataConfig 中是有对应值的, java.util.Properties#getProperty(java.lang.String) 获取时,String sval = (oval instanceof String) ? (String)oval : null;会返回 null

5

方便截图给我看下seataConfig里你锁说为null且有值的内容吗,你断点打好,点开seataConfig给我看下元素

4

我知道了,这里判断有点问题,我们处理下

0

为何关掉这个issue?

6

我试了下,其实没有问题,我之前怀疑properties.load到那种a=123会变成int,现在确认了是字符串类型,所以需要你这边再帮忙看下properties里到底元素是怎么样的