我正在为我的一个基于Spring的项目使用Spring WebSocket服务器实现。遇到了一个错误,显示“远程端点处于无效状态[TEXT_PARTIAL_WRITING]”。我发现问题是由于同时从不同线程向WebSocket写入造成的。
我是如何暂时解决这个问题的:考虑我已经实现了以下方法:
void sendMessageToSession(WebsocketSession session,String message);
该方法向 WebSocket 会话发送 TextMessage。由于多个线程可以为不同的 WebSocket 会话和消息调用该方法,因此无法使整个方法同步执行。同时也无法将会话放入同步块中(尝试过但失败了)。
不过,我通过以下方式解决了问题。
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);
注意 我将我的websocket会话保存在一个映射中,其中键是session.getId,值是session本身。
与其他一些websocket实现不同,Spring websocket的引用在每个消息上似乎并不相等。我通过它们的ID将会话保存在一个映射中,在每个消息上,我检查传递的websocket与我已经放置在映射中的websocket的相等性,结果为false。
synchronized(session.getId())
无法解决您的问题。 - xingbin