spring-boot-starter-websocket访问wss重连报错
·
1、wss心跳每30秒一次,3次收不到心跳即90秒钟收不到心跳断开连接
2、nginx配置ssl访问wss配置如下
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#gzip on;
# WS server
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream wsbackend {
server 127.0.0.1:18085;
keepalive 1000;
}
server {
listen 443 ssl;
server_name localhost;
# 证书路径
ssl_certificate jerry2.pem;
ssl_certificate_key jerry2.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_http_version 1.1;
proxy_pass http://wsbackend;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 90s;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
其中 proxy_read_timeout 90s; 设置90秒,三次收不到心跳nginx断开连接。
4、然后使用java代码访问wss,心跳超时断线重连出现以下报错信息
13:47:15.816 [WebSocketClient-SecureIO-1] ERROR c.p.p.c.HelmetWSSHandler - [processClose,103] - 头盔链接关闭sessionId=0错误吗:CloseReason: code [1006], reason [Unexpected Status of SSLEngineResult after an unwrap() operation]
javax.websocket.DeploymentException: The HTTP request to initiate the WebSocket connection to [wss://127.0.0.1:443] failed
at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServerRecursive(WsWebSocketContainer.java:493)
at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:197)
at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:154)
at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:171)
at com.pojo.prj.service.impl.DeviceServiceImpl.helmetWSSLogin(DeviceServiceImpl.java:233)
at com.pojo.prj.service.impl.DeviceServiceImpl$$FastClassBySpringCGLIB$$85d8c6d.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687)
at com.pojo.prj.service.impl.DeviceServiceImpl$$EnhancerBySpringCGLIB$$2ed12b9f.helmetWSSLogin(<generated>)
at com.pojo.prj.config.HelmetWSSHandler.processClose(HelmetWSSHandler.java:104)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:103)
at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:556)
at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:502)
at org.apache.tomcat.websocket.WsFrameClient.close(WsFrameClient.java:132)
at org.apache.tomcat.websocket.WsFrameClient.access$100(WsFrameClient.java:31)
at org.apache.tomcat.websocket.WsFrameClient$WsFrameClientCompletionHandler.failed(WsFrameClient.java:175)
at org.apache.tomcat.websocket.WsFrameClient$WsFrameClientCompletionHandler.failed(WsFrameClient.java:148)
at org.apache.tomcat.websocket.AsyncChannelWrapperSecure$WrapperFuture.fail(AsyncChannelWrapperSecure.java:472)
at org.apache.tomcat.websocket.AsyncChannelWrapperSecure$ReadTask.run(AsyncChannelWrapperSecure.java:339)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.InterruptedException
at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1367)
at java.base/java.util.concurrent.CountDownLatch.await(CountDownLatch.java:278)
at org.apache.tomcat.websocket.AsyncChannelWrapperSecure$WrapperFuture.get(AsyncChannelWrapperSecure.java:506)
at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServerRecursive(WsWebSocketContainer.java:350)
... 25 more
5、解决方法,修改nginx配置
proxy_read_timeout 90s;
把90改成3600,这个数值一定要大于心跳超时的时间。
更多推荐


所有评论(0)