原因:
连接socket时需要通过IP获取到对应主机的域名来进行连接,此过程会相当耗时。前端有一个超时时间,导致无法在规定时间内收到服务端消息而触发超时操作。
表现:
windows及linux下可不同时出现,与DNS解析的配置有关。浏览器console界面会打印大量websocket is closed 错误消息。可能伴随着刷新很慢之类的相关异常现象
解决方法:
1 在hosts文件中添加对应IP的反解析,如:示例IP IP ,其中IP为服务机器的内网地址,无效则自己通过堆栈在某个地方debug代码来确认
我是通过第一种办法解决的;
sudo vim /etc/hosts (通过hostnamectl获取机器名)
追加一行
内网IP 机器名全称 机器名(去掉.后缀)
实例:
192.168.0.11 AP-SHA-VM-P85.internal.sungard.corp AP-SHA-VM-P85
2 重写SocketWrapperBase类的getLocalName方法,直接返回其私有属性localAddr。此处不做赘述,存在多个类可用于重写代码,根据需要自己合理选择
3 修改DNS相关配置(可能还存在其他相关配置,个人没有找到方法1外的相关配置,故无法给出实际例子)
推荐:
卡顿的时候可以使用JDK自带工具进行分析
获取程序进程号
JPS
获取当前程序的堆栈
JSTACK PID > stack.log