我的Spring Boot应用程序中有一个使用Web套接字的讨厌的bug。随机发生在我的MyWebSocketHandler类中,被覆盖的方法handleTextMessagehandleBinaryMessage方法在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的新请求到达handleTextMessagehandleBinaryMessage,并且由于记录已从activeSessions映射中删除而引发异常。

关于此行为的可能原因有什么想法?

最佳答案

在您的会话中使用类似这样的内容:

 synchronized (session) {
                    do something with session
                }

关于java - 在Spring Boot Web Sockets中的afterConnectionClosed之后调用handleMessage,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58606741/

10-10 19:49