Atmosphere.js 501 不支持 Websocket 协议
Atmosphere.js 501 Websocket protocol not supported
在带有 Python websocket-client-0.20.0 客户端的 Jetty 上的 Atmosphere 2.2.0 运行 上,有时,尽管很少见,我们的日志中会出现以下情况:
12:18:01.105 WARN org.atmosphere.websocket.WebSocket: Unable to write 501 Websocket protocol not supported
12:18:01.106 WARN o.a.w.protocol.SimpleHttpProtocol: Status code higher or equal than 400. Unable to deliver the websocket messages to installed component. Status 501 Message Websocket protocol not supported
这种垃圾邮件发生得非常快,大约每隔 5 毫秒一次,如果在生产中发生这种情况,除了关闭系统之外别无他法。所以我们真的需要避免这种情况。
这可能是我们客户端的问题,但我想知道是否有办法在服务器后端识别这些类型的错误并关闭连接,如果我们不能想出解决根本原因的办法?
...编辑,大约六个月后:这个问题似乎是由早期的 Jetty 异常引起的:
11:05:54.363 错误 o.a.container.Jetty9WebSocketHandler: {}
org.eclipse.jetty.websocket.api.WebSocketTimeoutException:读取超时 org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onReadTimeout(AbstractWebSocketConnection.java:521) [devi
ce-interaction-service-1.0.jar:na]
在 org.eclipse.jetty.io.AbstractConnection.onFillInterestedFailed(AbstractConnection.java:258) [device-interaction-service-1.0
.jar:na]
在 org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onFillInterestedFailed(AbstractWebSocketConnection.java:4
97) [设备交互服务-1.0.jar:na]
在 org.eclipse.jetty.io.AbstractConnection$ReadCallback$1.run(AbstractConnection.java:420) [device-interaction-service-1.0.jar
:不]
在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601) [device-interaction-service-1.0.jar:na]
在 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532) [device-interaction-service-1.0.jar:na]
在 java.lang.Thread.run(Thread.java:745) [na:1.8.0_51]
11:05:54.365 DEBUG o.a.w.DefaultWebSocketProcessor: 无法正确完成 2d48f7ce-6150-42c2-b815-93acf94bdb93
11:05:55.156 WARN org.atmosphere.websocket.WebSocket: 无法写入 501 Websocket 协议不受支持
11:05:55.157 WARN o.a.w.protocol.SimpleHttpProtocol:状态代码高于或等于 400。无法将 websocket 消息传送到已安装的组件。状态 501 消息 不支持 Websocket 协议
11:05:55.201 WARN org.atmosphere.websocket.WebSocket: 无法写入 501 Websocket 协议不受支持
11:05:55.202 WARN o.a.w.protocol.SimpleHttpProtocol:状态代码高于或等于 400。无法将 websocket 消息传送到已安装的组件。状态 501 消息 不支持 Websocket 协议
11:05:55.203 WARN org.atmosphere.websocket.WebSocket: 无法写入 501 Websocket 协议不受支持
...
在我看来,连接仍然挂起,并且在我的@ManagedService 上没有调用任何@Disconnect 方法。
我想知道如何拦截它并关闭连接,强制客户端重新连接。
编写自己的 WebSocketProtocol 或扩展 SimpleHttpProtocol#onError https://github.com/Atmosphere/atmosphere/wiki/Writing-WebSocket-Sub-Protocol
在带有 Python websocket-client-0.20.0 客户端的 Jetty 上的 Atmosphere 2.2.0 运行 上,有时,尽管很少见,我们的日志中会出现以下情况:
12:18:01.105 WARN org.atmosphere.websocket.WebSocket: Unable to write 501 Websocket protocol not supported
12:18:01.106 WARN o.a.w.protocol.SimpleHttpProtocol: Status code higher or equal than 400. Unable to deliver the websocket messages to installed component. Status 501 Message Websocket protocol not supported
这种垃圾邮件发生得非常快,大约每隔 5 毫秒一次,如果在生产中发生这种情况,除了关闭系统之外别无他法。所以我们真的需要避免这种情况。
这可能是我们客户端的问题,但我想知道是否有办法在服务器后端识别这些类型的错误并关闭连接,如果我们不能想出解决根本原因的办法?
...编辑,大约六个月后:这个问题似乎是由早期的 Jetty 异常引起的:
11:05:54.363 错误 o.a.container.Jetty9WebSocketHandler: {} org.eclipse.jetty.websocket.api.WebSocketTimeoutException:读取超时 org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onReadTimeout(AbstractWebSocketConnection.java:521) [devi ce-interaction-service-1.0.jar:na] 在 org.eclipse.jetty.io.AbstractConnection.onFillInterestedFailed(AbstractConnection.java:258) [device-interaction-service-1.0 .jar:na] 在 org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onFillInterestedFailed(AbstractWebSocketConnection.java:4 97) [设备交互服务-1.0.jar:na] 在 org.eclipse.jetty.io.AbstractConnection$ReadCallback$1.run(AbstractConnection.java:420) [device-interaction-service-1.0.jar :不] 在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601) [device-interaction-service-1.0.jar:na] 在 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532) [device-interaction-service-1.0.jar:na] 在 java.lang.Thread.run(Thread.java:745) [na:1.8.0_51] 11:05:54.365 DEBUG o.a.w.DefaultWebSocketProcessor: 无法正确完成 2d48f7ce-6150-42c2-b815-93acf94bdb93 11:05:55.156 WARN org.atmosphere.websocket.WebSocket: 无法写入 501 Websocket 协议不受支持 11:05:55.157 WARN o.a.w.protocol.SimpleHttpProtocol:状态代码高于或等于 400。无法将 websocket 消息传送到已安装的组件。状态 501 消息 不支持 Websocket 协议 11:05:55.201 WARN org.atmosphere.websocket.WebSocket: 无法写入 501 Websocket 协议不受支持 11:05:55.202 WARN o.a.w.protocol.SimpleHttpProtocol:状态代码高于或等于 400。无法将 websocket 消息传送到已安装的组件。状态 501 消息 不支持 Websocket 协议 11:05:55.203 WARN org.atmosphere.websocket.WebSocket: 无法写入 501 Websocket 协议不受支持 ...
在我看来,连接仍然挂起,并且在我的@ManagedService 上没有调用任何@Disconnect 方法。
我想知道如何拦截它并关闭连接,强制客户端重新连接。
编写自己的 WebSocketProtocol 或扩展 SimpleHttpProtocol#onError https://github.com/Atmosphere/atmosphere/wiki/Writing-WebSocket-Sub-Protocol