Dubbo启动时检查依赖

2 篇文章 0 订阅

问题描述

Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check=true。

第一次访问调用该依赖服务时,会报如下错误:

017-06-21 11:03:14.655 [TI11031465537] INFO [Log4jLogger.java:58] [DUBBO] Register: consumer://192.168.7.155/com.unicompayment.mmp.cep.api.service.CepMarketingOperationService?application=mmpfront.provider&category=consumers&check=false&default.retries=0&dubbo=2.8.4&interface=com.unicompayment.mmp.cep.api.service.CepMarketingOperationService&methods=realtimeOperationService&pid=22723&revision=1.0.0-SNAPSHOT&side=consumer&timestamp=1498014194642, dubbo version: 2.8.4, current host: 192.168.7.155
2017-06-21 11:03:14.693 [TI11031465537] INFO [Log4jLogger.java:58] [DUBBO] Subscribe: consumer://192.168.7.155/com.unicompayment.mmp.cep.api.service.CepMarketingOperationService?application=mmpfront.provider&category=providers,configurators,routers&default.retries=0&dubbo=2.8.4&interface=com.unicompayment.mmp.cep.api.service.CepMarketingOperationService&methods=realtimeOperationService&pid=22723&revision=1.0.0-SNAPSHOT&side=consumer&timestamp=1498014194642, dubbo version: 2.8.4, current host: 192.168.7.155
2017-06-21 11:03:14.783 [TI11031465537] INFO [Log4jLogger.java:58] [DUBBO] Notify urls for subscribe url consumer://192.168.7.155/com.unicompayment.mmp.cep.api.service.CepMarketingOperationService?application=mmpfront.provider&category=providers,configurators,routers&default.retries=0&dubbo=2.8.4&interface=com.unicompayment.mmp.cep.api.service.CepMarketingOperationService&methods=realtimeOperationService&pid=22723&revision=1.0.0-SNAPSHOT&side=consumer&timestamp=1498014194642, urls: [empty://192.168.7.155/com.unicompayment.mmp.cep.api.service.CepMarketingOperationService?application=mmpfront.provider&category=providers&default.retries=0&dubbo=2.8.4&interface=com.unicompayment.mmp.cep.api.service.CepMarketingOperationService&methods=realtimeOperationService&pid=22723&revision=1.0.0-SNAPSHOT&side=consumer&timestamp=1498014194642, empty://192.168.7.155/com.unicompayment.mmp.cep.api.service.CepMarketingOperationService?application=mmpfront.provider&category=configurators&default.retries=0&dubbo=2.8.4&interface=com.unicompayment.mmp.cep.api.service.CepMarketingOperationService&methods=realtimeOperationService&pid=22723&revision=1.0.0-SNAPSHOT&side=consumer&timestamp=1498014194642, empty://192.168.7.155/com.unicompayment.mmp.cep.api.service.CepMarketingOperationService?application=mmpfront.provider&category=routers&default.retries=0&dubbo=2.8.4&interface=com.unicompayment.mmp.cep.api.service.CepMarketingOperationService&methods=realtimeOperationService&pid=22723&revision=1.0.0-SNAPSHOT&side=consumer&timestamp=1498014194642], dubbo version: 2.8.4, current host: 192.168.7.155
2017-06-21 11:03:14.793 [TI11031465537] ERROR [StatisticFilter.java:90]statisticFilter fail, flowNo=ljn1498014185051, key=RCS144e740dcfe84c02a5977458b9e65473
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cepMarketingOperationService': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: Failed to check the status of the service com.unicompayment.mmp.cep.api.service.CepMarketingOperationService. No provider available for the service com.unicompayment.mmp.cep.api.service.CepMarketingOperationService from the url zookeeper://192.168.8.55:2181/com.alibaba.dubbo.registry.RegistryService?application=mmpfront.provider&default.retries=0&dubbo=2.8.4&interface=com.unicompayment.mmp.cep.api.service.CepMarketingOperationService&methods=realtimeOperationService&pid=22723&revision=1.0.0-SNAPSHOT&side=consumer&timestamp=1498014194642 to the consumer 192.168.7.155 use dubbo version 2.8.4
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:175) ~[spring-beans-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:103) ~[spring-beans-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1600) ~[spring-beans-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:254) ~[spring-beans-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:220) ~[spring-beans-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:352) ~[spring-beans-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:333) ~[spring-beans-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1088) ~[spring-context-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at com.unicompayment.mmp.front.util.SpringContextUtil.getBean(SpringContextUtil.java:30) ~[SpringContextUtil.class:na]
    at com.unicompayment.mmp.front.filter.StatisticFilter.execute(StatisticFilter.java:77) ~[StatisticFilter.class:na]
    at com.unicompayment.mmp.front.core.CallableFilter.call(CallableFilter.java:93) [CallableFilter.class:na]
    at com.unicompayment.mmp.front.core.CallableFilter.call(CallableFilter.java:43) [CallableFilter.class:na]
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_79]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_79]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_79]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_79]
Caused by: java.lang.IllegalStateException: Failed to check the status of the service com.unicompayment.mmp.cep.api.service.CepMarketingOperationService. No provider available for the service com.unicompayment.mmp.cep.api.service.CepMarketingOperationService from the url zookeeper://192.168.8.55:2181/com.alibaba.dubbo.registry.RegistryService?application=mmpfront.provider&default.retries=0&dubbo=2.8.4&interface=com.unicompayment.mmp.cep.api.service.CepMarketingOperationService&methods=realtimeOperationService&pid=22723&revision=1.0.0-SNAPSHOT&side=consumer&timestamp=1498014194642 to the consumer 192.168.7.155 use dubbo version 2.8.4
    at com.alibaba.dubbo.config.ReferenceConfig.createProxy(ReferenceConfig.java:420) ~[dubbo-2.8.4.jar:2.8.4]
    at com.alibaba.dubbo.config.ReferenceConfig.init(ReferenceConfig.java:300) ~[dubbo-2.8.4.jar:2.8.4]
    at com.alibaba.dubbo.config.ReferenceConfig.get(ReferenceConfig.java:138) ~[dubbo-2.8.4.jar:2.8.4]
    at com.alibaba.dubbo.config.spring.ReferenceBean.getObject(ReferenceBean.java:65) ~[dubbo-2.8.4.jar:2.8.4]
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168) ~[spring-beans-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    ... 15 common frames omitted

后续再访问会报空指针,如下所示:

2017-06-21 11:03:37.535 [TI11031465537] ERROR [StatisticFilter.java:90]statisticFilter fail, flowNo=ljn1498014208581, key=RCSbeda97ef673c4dfc928b602f720563e3
java.lang.NullPointerException: null
    at com.unicompayment.mmp.front.filter.StatisticFilter.execute(StatisticFilter.java:82) ~[StatisticFilter.class:na]
    at com.unicompayment.mmp.front.core.CallableFilter.call(CallableFilter.java:93) [CallableFilter.class:na]
    at com.unicompayment.mmp.front.core.CallableFilter.call(CallableFilter.java:43) [CallableFilter.class:na]
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_79]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_79]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_79]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_79]

原因

如果你的Spring容器是懒加载的,或者通过API编程延迟引用服务,请关闭check,否则服务临时不可用时,会抛出异常,拿到null引用,
如果check=false,总是会返回引用,当服务恢复时,能自动连上。

解决方案示例

可以通过check=”false”关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。

关闭某个服务的启动时检查:(没有提供者时报错)

<dubbo:reference id="cepMarketingOperationService" interface="com.unicompayment.mmp.cep.api.service.CepMarketingOperationService" registry="realRiskRegistry" check="false"/>

上述报错的实际解决方案

关闭所有服务的启动时检查:(没有提供者时报错)

dubbo:consumer
check=”false”/>

关闭注册中心启动时检查:(注册订阅失败时报错)

dubbo:registry
check=”false”/>

也可以用dubbo.properties配置:

dubbo.reference.com.foo.BarService.check=false

dubbo.reference.check=false

dubbo.consumer.check=false

dubbo.registry.check=false

也可以用-D参数:

java
-Ddubbo.reference.com.foo.BarService.check=false

java
-Ddubbo.reference.check=false

java
-Ddubbo.consumer.check=false

java
-Ddubbo.registry.check=false

注意区别
1)dubbo.reference.check=false,强制改变所有reference的check值,就算配置中有声明,也会被覆盖。
2)dubbo.consumer.check=false,是设置check的缺省值,如果配置中有显式的声明,如:,不会受影响。
3)dubbo.registry.check=false,前面两个都是指订阅成功,但提供者列表是否为空是否报错,如果注册订阅失败时,
也允许启动,需使用此选项,将在后台定时重试。

引用缺省是延迟初始化的,只有引用被注入到其它Bean,或被getBean()获取,才会初始化。
如果需要饥饿加载,即没有人引用也立即生成动态代理,可以配置:

dubbo:reference
interface="com.foo.BarService"
init="true"/>

参考:http://blog.csdn.net/tanga842428/article/details/52685428
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值