原创

spring websocket服务自动断开连接

1.博客上线之后总是发现莫名报错!

2019-06-08 12:13:20 [org.apache.juli.logging.DirectJDKLog:182] ERROR - No error handling configured for [com.xxx.xxx.xxxWebsocketServer] and the following error occurred
java.io.EOFException: null
        at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1289)
        at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1223)
        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:806)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

分析一下

1)这是websocket报错了,可这个异常信息基本看不出和服务端业务相关的信息,那就应该考虑配置问题了
2)突然想到 这个是俺线上的wss服务,走了一层nginx反向代理, wss://域名/ws
3)我本机测试环境是 ws://域名+端口/ws 直连ws服务好像没有这种情况!!,我突然明白啥。。。应该是nginx代理配置问题

2.nginx转发wss配置增加读取超时时间

        location /websocket {
                # proxy_pass http://127.0.0.1:8082;
                proxy_pass http://blogadminWebscoket;
                proxy_http_version 1.1;
                proxy_connect_timeout 5s;
                proxy_read_timeout 150s;
                proxy_send_timeout 10s;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "Upgrade";
                proxy_set_header X-Real-IP $remote_addr;
        }

1)将原来location /websocket 改成上面的配置增加了一次二次通讯等待的超时时间150s
2)但是150秒之后还是断开连接了,让nginx设置超时时间来保持ws长连接不合适啊

3.websocket客户端增加心跳

1)其实不仅是websocket,所有基于tcp长连接都需要有心跳机制
2)心跳消息包可以是一个ping信息,也可以是更简单的信息,也可以是一串业务数据信息,我之前在某直播,app和服务端的长连接心跳就是传业务数据信息,需要记录xx信息,也是业务比不可少的

$.websocket.resetPing().ping();

......
        resetPing: function(){
            console.log("resetPing")
            clearTimeout(this._pingObj);
            return this;
                },
        ping: function (){
            this._pingObj = setInterval(function(){
                $.websocket.send("ping");
            },60000)
        }

1)设置每分钟ping一次,这就完成了简单的前端心跳,这里也比较简单,代码就不贴全了
2)现在博客线上的自动断开连接和报错就都没有了

文章只写了解决的思路和核心修改的代码,网上文章千篇一律各种代码,只有自己理解了才能去写适合自己项目的代码

正文到此结束
本文目录