赞
踩
近几天入职新公司啦,头几天当然是熟悉项目,搭建开发环境啦,公司的项目中用到了 Dubbo。启动项目时,踩到了一个比较难碰到的坑,因此把它作为笔记记录下来。
使用 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
jdk版本原本使用的是:1.8.0_331,替换成:1.8.0_181即可解决此问题。
问题处理思路
因为本人微服务基础薄弱,对于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版本之后,项目就可以正常启动了(当然,感兴趣的小伙伴可以研究下其余解决方案)。
文章持续更新,可以微信搜索「 杰哥是真想教会你 」第一时间阅读,回复【面试】有我准备的一些在精不在多的面试资料。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。