- tomcat 管理页面,reload 或者 stop 服务,然后再 start,服务就会端口占用。
原因:Tomcat 停止的时候,没有释放掉占用的资源。
解决方法:Tomcat 停止的时候,执行ProtocolConfig.destroyAll();
。
参考:
https://github.com/alibaba/dubbo/issues/333
web.xml 中配置监听器:
<listener>
<listener-class>com.common.listen.InitDeviceListener</listener-class>
</listener>
@Component
public class InitDeviceListener implements ServletContextListener {
Logger logger = LoggerFactory.getLogger(InitDeviceListener.class);
private String rootPath;
@Override
public void contextInitialized(ServletContextEvent sce) {
// tomcat 启动时执行
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
//tomcat结束时执行
ProtocolConfig.destroyAll();
}
}
- provider 和 consumer 启动要有顺序。如果 provider 没有启动,先启动 consumer 会报错。
具体现象:
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'demoService': FactoryBean threw exception on object creation;
nested exception is java.lang.IllegalStateException: Failed to check the status of the service com.modules.service.dubbo.DemoService. No provider available for the service …………
原因:
provider 没有启动,因此在zookeeper没有这个服务,就会报这个异常。
解决方法:使用懒加载调用服务。
@Lazy
@Autowired
DemoService demoService;
注意:这种方法可以让 provider 和 consumer 启动没有先后顺序。但如果 consumer 启动后,还没有等 provider 启动,就调用了接口,同样会报上面的异常。如果在报错后,再启动 provider,已经不管用了,因为 consumer 已经注入了服务,会报下面的异常:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.modules.service.dubbo.DemoService' available: Optional dependency not present for lazy injection point
因此,比较好的方式是:****不管先后顺序,先把两个服务都启动起来,然后再调用。
- provider 中断,consumer 调用服务会报异常。
具体现象:
com.alibaba.dubbo.rpc.RpcException: Forbid consumer …………
原因:zookeeper发现相关服务接口不存在提供者的时候,禁用了消费者调用该服务接口。
参考:http://blog.sina.com.cn/s/blog_4adc4b090102x12u.html