Dubbo Consumer调试中遇到的问题

在使用idea学习dubbo consumer的初始化时,遇到了一个奇怪的问题。consumer初始化时会调用com.alibaba.dubbo.config.ReferenceConfig#get方法,如下:

public synchronized T get() {
    if (destroyed){
        throw new IllegalStateException("Already destroyed!");
    }
  if (ref == null) {
    init();
  }
  return ref;
}
private void init() {
  if (initialized) {
      return;
  }
  initialized = true;

  checkAndLoadConfig();
  ref = createProxy();
}

在debug模式下,走到init方法的第一行代码时,发现initialized的值为true。排查代码发现initialized只在下面的代码中才会赋值为true。这就比较奇怪,为什么initialized在没有赋值的情况下会初始化为true呢? 由于initialized为true,导致不执行下面的crateProxy()方法,ref为null。

但是在run模式下,ref是有值的。debug模式下,如果只在这个方法之后打断点,也是有值的。 大致可以判断是debug模式的影响。

在网上搜了下,发现有大神通过打印日志找到了问题原因。过程很值得学习,所以把原文链接放在了文章的最后。

结论

idea这类编辑器在debug模式下,为了在断点处能显示一个类的实例,就会反射调用实例的toString,导致initialized被设置为true。

参考链接:

results matching ""

    No results matching ""