出现的异常信息如下:
Failed to save registry store file, cause: Can not lock the registry cache file /home/tomcat/.dubbo/dubbo-registry-yourZK_IP.cache, ignore and retry later, maybe multi java process use the file, please config: dubbo.registry.file=xxx.properties, dubbo version: 2.8.4, current host: yourIP
java.io.IOException: Can not lock the registry cache file /home/tomcat/.dubbo/dubbo-registry-yourZK_IP.cache, ignore and retry later, maybe multi java process use the file, please config: dubbo.registry.file=xxx.properties
原因分析:
根据异常信息我们得知:dubbo 在保存注册中心的服务列表时失败,dubbo 会将 服务的注册列表放到“/home/tomcat/.dubbo/dubbo-registry-yourZK_IP.cache”这个目录中,这也是dubbo 默认的存放地址,当你的一台机器开启多个服务的provider的时候(通过端口不同设置),多个provider 会都把服务列表写入其中,文件写入之前会加相互排斥的“写锁”,两个线程都要对其加写锁的时候就会发生冲突,后加的加不上去,会出现这个异常。
不过这个问题也可以忽略,因为当多个provider 的注册ZK(文件中的ZK_ip)一致的时候,才会是这个情况,出现这个情况后也无妨,因为获取到该锁的线程会写入一份一模一样的服务列表。
如果想要解决这个问题可以通过设置不同注册中心的写入文件来解决:
<dubbo:registry id="zkcenter" protocol="zookeeper" address="${zookeeprt.url}" file="your_file_address"/>
多个provider设置不同的file 就不会出现加写锁加不上的现象了。