当前位置:   article > 正文

Dubbo项目启动报错 — [DUBBO] Failed to save registry store file, cause: Invalid file path

failed to save registry store file, cause: invalid file path, dubbo version:

前言

近几天入职新公司啦,头几天当然是熟悉项目,搭建开发环境啦,公司的项目中用到了 Dubbo。启动项目时,踩到了一个比较难碰到的坑,因此把它作为笔记记录下来。

1、问题描述:

使用 idea 启动 Dubbo 项目,启动报错(一直报图片中的问题),且启动项目之后CPU很快就被拉满。

控制台报错:[DUBBO] Failed to save registry store file, cause: Invalid file path, dubbo version: 2.6.2, current host: 10.99.14.104

在这里插入图片描述

2、解决方法:

jdk版本原本使用的是:1.8.0_331,替换成:1.8.0_181即可解决此问题。

3、问题处理思路 & 错误原因分析

问题处理思路

因为本人微服务基础薄弱,对于Dubbo基本不懂,所以最开始以为是Dubbo的配置问题,所以百度了一个小时。后来发现网上没有分享相同问题的帖子,于是只能去问师傅(团队开发,不要死磕,该怂还得怂,可能人家一句话的事可以帮你节省一上午的时间)。

相同的配置,但是师傅那边项目可以正常启动。提醒修改了几个常见的易错点之外,启动还是报相同的问题。因为问的时候比较晚了,且师傅手上任务也比较多,当天暂时没有解决。到了第二天,接着跟师傅研究为啥项目启动会报这个问题。两者的代码和配置都是一毛一样的(当时怕有差异,甚至还在SVN上重新拉了两遍),但是我的就是起不来。

试验了各种方法之后,还是起不来。当时想到源码也是代码,没什么大不了的,万变不离其宗,所以决定去看Dubbo的源码。因为错误提示的很明显了,就是执行 AbstractRegistry 的 doSaveProperties 方法的时候报错了。

错误原因分析

断点到了下面这个位置,发现执行 createNewFile() 的文件路径里面有个:

PS:Windows中文件名无法包含以下特殊字符:

在这里插入图片描述

怪不得一直报:Invalid file path。而代码里面的 file 是在构造 AbstractRegistry 的时候赋值的,具体可参见源码:

public AbstractRegistry(URL url) {
        setUrl(url);
        // Start file save timer
        syncSaveFile = url.getParameter(Constants.REGISTRY_FILESAVE_SYNC_KEY, false);
    	// 文件名之所以会带 :号,就是因为拼接了 url.getAddress() 导致的,address里面配置了端口号,例如:172.16.5.117:2181
        String filename = url.getParameter(Constants.FILE_KEY, System.getProperty("user.home") + "/.dubbo/dubbo-registry-" + url.getParameter(Constants.APPLICATION_KEY) + "-" + url.getAddress() + ".cache");
        File file = null;
        if (ConfigUtils.isNotEmpty(filename)) {
            file = new File(filename);
            if (!file.exists() && file.getParentFile() != null && !file.getParentFile().exists()) {
                if (!file.getParentFile().mkdirs()) {
                    throw new IllegalArgumentException("Invalid registry store file " + file + ", cause: Failed to create directory " + file.getParentFile() + "!");
                }
            }
        }
        this.file = file;
        loadProperties();
        notify(url.getBackupUrls());
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在这里插入图片描述

可是为啥师傅那边一毛一样的代码运行不报错呢?后面师傅提示我对比两边的环境,终于发现是因为JDK版本的差别!是 createNewFile 这个方法的实现有差别导致的,我用的是1.8.0_331,文件名不合法直接就抛异常了;而师傅用的是 1.8.0_181,如果文件名中含有 :会以:符号前面的那部分作为文件名,创建文件,所以就可以正常运行。就像这样:
在这里插入图片描述
所以解决方法想必大家已经很清楚了,直接换了个JDK版本之后,项目就可以正常启动了(当然,感兴趣的小伙伴可以研究下其余解决方案)。


我是杰哥,一个在IT行业中正在不断学习的程序员。 欢迎各位说话好听的人才们一键三连,你们的支持是我更新的最大动力,咱们下期见~

文章持续更新,可以微信搜索「 杰哥是真想教会你 」第一时间阅读,回复【面试】有我准备的一些在精不在多的面试资料。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/165933
推荐阅读
相关标签
  

闽ICP备14008679号