之前使用dubbo2.5.4的时候一直有个问题:服务启动的时候,如果是先启动consumer后启动provider,则通过@Referrence获取的service会报空指针异常。而先启动provider后启动consumer服务可以正常访问,网上说设置check属性为false,但试过了无效。
网上很多人说可以,但自己的项目就是不行,跟了一下dubbo的源码。
先启动consumer,后启动provider,在启动provider的时候,通过consumer的日志看到zookeeper确实向consumer发送注册信息了,
但是在ReferenceConfig类中发现一个不太对劲的参数:
图中的check属性就是在@Referrence中设置的check参数,自己明明设了false,到了这里却变成了null,还设成了true。
这情况说明了自己设的check属性是没用的。
最后google发现这是dubbo2.5.4的一个bug,在2.5.6版本修复了,将dubbo的版本换成2.5.6后,再跟一次源码:
这样能取到check的值了,服务也能正常获取。
另:在更换dubbo版本的时候还出了一个小问题:如果provider的配置@Service上使用了protocol = “dubbo” 参数,启动时会报 No bean named 'dubbo' available 的错。
把 protocol = “dubbo” 去掉就好了,网上说2.5.6版本的dubbo支持多协议,但为什么不能指定协议了,这个问题有待探讨。