springboot项目启动dubbo服务时,出现以下报错日志(但不影响启动)
[DUBBO] Failed to save registry cache file, will retry, cause: null, dubbo version: 3.0.7, current host x.x.x.x
java.nio.channels.OverlappingFileLockException: null
at sun.nio.ch.SharedFileLockTable.checkList(FileLockTable.java:255) ~[na:1.8.0_221]
at sun.nio.ch.SharedFileLockTable.add(FileLockTable.java:152) ~[na:1.8.0_221]
at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1107) ~[na:1.8.0_221]
at java.nio.channels.FileChannel.tryLock(FileChannel.java:1155) ~[na:1.8.0_221]
at org.apache.dubbo.registry.support.AbstractRegistry.doSaveProperties(AbstractRegistry.java:192) ~[dubbo-3.0.7.jar:3.0.7]
at org.apache.dubbo.registry.support.AbstractRegistry$SaveProperties.run(AbstractRegistry.java:585) [dubbo-3.0.7.jar:3.0.7]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_221]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_221]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_221]
网上搜索,说是
Dubbo 服务向 ZK 注册的同时,会本地缓存服务列表,写入user.home/.dubbo/dubbo-registry-” + url.getHost() + “.cache 这个文件(Windows默认是写到当前用户文件夹下的.dubbo文件夹),当在同一个机器上启动多个Provider的时候,就会出现文件锁争用的问题,报上面这个错误。
但是我疑惑的是,我只是启动一个服务而已,不属于这种情况啊。后面去本地.dubbo文件夹查看
dubbo-registry-**.cache
文件,竟然发现一个确实有一个不属于当前启动服务的服务名称。
于是在项目中搜索这个类,原来是另一个模块的dubbo服务提供者。
所以大概猜到问题了,由于这个项目是由2个模块组成,包名也相同,当初是因为项目公用一套数据库实体类,为了方便就把2个系统的代码写在一个项目中,我猜想上面的报错是因为一个模块中依赖注入 (使用的@DubboReference)引用了另一个模块的服务类,导致扫描到了另一个模块的服务提供者。
于是我尝试把@DubboReference注解去掉后再启动,果然没有报错了。
虽然本地会报这个错误,但不影响使用,实际部署是不会的,因为打包的时候其实代码是已经自动拆分好的了,自然也就不会有这种情况。