栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 前言
  • 1、问题描述:
  • 2、解决方法:
  • 3、问题处理思路 & 错误原因分析

前言

近几天入职新公司啦,头几天当然是熟悉项目,搭建开发环境啦,公司的项目中用到了 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());
    }

可是为啥师傅那边一毛一样的代码运行不报错呢?后面师傅提示我对比两边的环境,终于发现是因为JDK版本的差别!是 createNewFile 这个方法的实现有差别导致的,我用的是1.8.0_331,文件名不合法直接就抛异常了;而师傅用的是 1.8.0_181,如果文件名中含有 :会以:符号前面的那部分作为文件名,创建文件,所以就可以正常运行。就像这样:

所以解决方法想必大家已经很清楚了,直接换了个JDK版本之后,项目就可以正常启动了(当然,感兴趣的小伙伴可以研究下其余解决方案)。


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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/999326.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号