我的Spring Boot应用程序中有一个使用Web套接字的讨厌的bug。随机发生在我的MyWebSocketHandler
类中,被覆盖的方法handleTextMessage
或handleBinaryMessage
方法在afterConnectionClosed
之后被调用。
我以为这是一个客户端的问题,但是多个客户端导致了相同的问题。
这是我的简化代码。
@Component
public class MyWebSocketHandler extends AbstractWebSocketHandler {
private Map<String, ClientSession> activeSessions = new ConcurrentHashMap<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
activeSessions.put(session.getId(), clientSession);
// doing work
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
activeSessions.remove(session.getId())
// doing work
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
checkSession(session); // Random Exception here
// doing work
}
@Override
protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
checkSession(session); // Random Exception here
// doing work
}
private void checkSession(WebSocketSession session){
if(activeSessions.get(session.getId() == null){
throw new RuntimeException();
}
}
}
afterConnectionClosed
显示关闭状态1000
,并且在同一毫秒内具有相同sessionId
的新请求到达handleTextMessage
或handleBinaryMessage
,并且由于记录已从activeSessions
映射中删除而引发异常。关于此行为的可能原因有什么想法?
最佳答案
在您的会话中使用类似这样的内容:
synchronized (session) {
do something with session
}
关于java - 在Spring Boot Web Sockets中的afterConnectionClosed之后调用handleMessage,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58606741/