概述
问题描述
- Dubbo应用启动成功
- 在Dubbo Admin可以看到服务状态为正常(存在提供者和消费者)。
- Zookeeper所在服务器能ping通Dubbo应用所在服务器。
在这种情况下,消费者请求服务时一直提示message can not send, because channel is closed
。
问题分析(仅供参考)
message can not send, because channel is closed,意为管道关闭,消息无法发送。为什么要发送消息,是因为消费者A发起请求提供者B时,注册中心找到了提供者B,此时需要通知需要提供者B执行服务,而执行什么服务,参数是什么,就是注册中心要发送的消息。
问题排查
出现这个问题,原因只有一个——端口未开放。我们知道每个Dubbo应用都会占用一个系统端口,默认为20880。当Dubbo应用增多,需要开放的端口也需要增多。这也是经常被忽略的一点。可以通过以下方式检查:
通过vim /etc/sysconfig/iptables
查看端口设置,如下
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 20880:20890 -j ACCEPT
这样的配置表示开启了22端口和20880至20890(含)的端口。如需新增,那么在新增后需要执行以下两句命令
/etc/init.d/iptables restart
/etc/init.d/iptables save
关于iptables更详细的内容请参阅博文《Linux - iptables》
其它情况
有网友表示以下情况也会导致message can not send, because channel is closed。经过实践分析,以下情况并不会导致该问题的出现。
- 服务端未正常运行
如果服务端没有正常运行,或者禁用了消费者对某接口的调用,将会出现Failed to invoke the method xxx in the service com.xxx.xxx.XxxService. No provider available for the service ...
- dubbo对外发布接口不正常
接口不正常要么接口本身出现异常,要么导致Dubbo应用无法启动,不会导致该问题的出现。 - 网络不通
网络不通是不会成功注册到注册中心的。
(完)
最后
以上就是俭朴夏天为你收集整理的Java异常 - Dubbo RemotingException: message can not send, because channel is closed的全部内容,希望文章能够帮你解决Java异常 - Dubbo RemotingException: message can not send, because channel is closed所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复