【发布时间】:2018-07-14 10:28:47
【问题描述】:
我正在为我的一个基于 Spring 的项目使用 Spring WebSocket 服务器实现。我遇到了一个错误,说The remote endpoint was in state [TEXT_PARTIAL_WRITING] which is invalid state。我发现问题是同时从不同的线程写入 websocket。
我如何临时修复它:考虑我已经实现了以下方法
void sendMessageToSession(WebsocketSession session,String message);
将 TextMessage 发送到 websocket 会话。我不能使整个方法同步,因为多个线程可以为不同的 websocketSessions 和消息调用它。我也不能把会话放在同步块中(试过但没用)
虽然,我这样解决了我的问题
synchronized(session.getId()){
//sending message;
}
我不再面临这个问题。但在同步块中使用字符串似乎不是一个好习惯。 那么我还有什么其他解决方案?发送异步消息的最佳方式是什么?
PS:建立连接后我已经使用ConcurrentWebSocketSessionDecorator,并且我正在使用更新的websocket。没有帮助。
session = new ConcurrentWebSocketSessionDecorator(session, (int) StaticConfig.MAXIMUM_WS_ASYNC_SEND_TIMEOUT, StaticConfig.MAXIMUM_WS_BINARY_BUFFER_SIZE * 2);
注意 我将我的 websocet 会话保存在地图中,其中键是 session.getId,值是会话本身。
与其他一些 websocket 实现不同,Spring websocket 引用在每条消息上似乎并不相同。我通过他们的 ID 将会话保存在地图中,并在每条消息上检查传递的 websocket 与我已经放在地图上的 websocket 的相等性,它是错误的。
【问题讨论】:
-
据我所知,
synchronized(session.getId())无法解决您的问题.. -
@user27149 好吧,我现在没有遇到任何异常,因为我正在使用它并且系统运行良好,所以我可以说它确实解决了我的问题(暂时是因为我问这个问题是为了找到合适的解决方法)
-
是的,我知道您正在寻求更好的解决方案...
-
当您尝试同步(会话)时会发生什么?
-
@WarrenDew 仍然是同样的错误。另请参阅我的笔记
标签: java spring multithreading spring-websocket