节前,一应用访问远程EJB接口时,发生奇怪的现象:客户机原本能访问远程Apusic服务器的EJB接口,某天开始就无法访问。经查,远程Apusic服务器上配置两块网卡,一块设置地址A,接网线;另一块未接网线,操作系统(Windows)默认地址为B。客户机调用rmi://A时失败,从异常信息来看,客户机试图访问地址B。尝试禁用地址B所在网卡并重启客户机应用后,恢复正常访问。
节后,和厂商技术支持人员一起讨论分析了这个问题。问题来源于java.net.InetAddress。EJB容器(不管是哪个厂家的)在生成stub时,会写入服务器的IP地址,而这个IP地址是通过类java.net.InetAddress提供的相关方法来获取的。以下是com.apusic.net.Muxer的代码片段:
if (address != null )
bindAddress = InetAddress.getByName(address);
else
bindAddress = InetAddress.getLocalHost();
而在存在多块网卡的情况下,InetAddress.getLocalHost()所返回的IP地址是不明确的,这就是问题所在。
在Apusic 6.0中,可通过配置apusic.conf中的Muxer服务一节,增加Address属性,指定IP(就是上面代码片段中的address了)。
其实,多网卡的问题早也碰到过,比如在集群环境中,不能正确地获得想要的集群IP。