at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1206) at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1140) at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(W
项目升级上线前本地和测试环境都是正常运行的,线上的日志文件中却多了很多的错误日志。
java.io.EOFException: null
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1206)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1140)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770)
百度+谷歌,基本上就是说心跳的原因,说如果开启了nginx反向代理,超时时间设置的过短是nginx关掉了websocket,需要增强ping/pong(心跳维持)机制。
经过排查并非是这个原因导致的,客户端和服务器都会定时向对方发送心跳报文。
前端js中是使用setInterval来定时发送心跳包的,在切换tab页的时候并未发现定时任务会停止(原来是会的,这里不知道什么鬼,或许是频率较低或者是局域网ip)。
最终我断开网络连接,惊喜的发现了idea控制台中那渴望的错误信息,解决方案如下:
public void onError(Session session, Throwable throwable) { if ((throwable instanceof EOFException) && throwable.getCause() == null) { logger.warn("客户端异常退出:{}", session.getId()); } else { logger.error("socket发生异常:{}", session.getId()); logger.error("异常信息", throwable); } try { session.close(); } catch (IOException e) { logger.error("关闭socket发生异常", e); } }
眼不见为净。