​ 最近项目使用到了Websocket来做在线咨询,项目上到联调环境的时候,发现前端连接上Websocket之后就自动断了,而且并没有触发关闭事件,查看了后台日志后,发现这个会话还存在,并且推送线程还在一直给这个会话推送消息.

​ 由于我没有联调环境...只能通过远程看日志,一时分析不出来一个所以然. 之后我尝试在测试环境进行复现,再试了几次之后,发现了端倪,在PollingThread发生了异常,导致该会话无法正确关闭,异常提示信息为: The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method .

​ 在网上查了半天后,原因是多个线程同时调用sendMessage方法,导致出现TEXT_FULL_WRITING 状态,只需要保证session在同一时间内不会被多个线程同时调用即可,可以加个同步锁,代码如下:

public void sendMessageToUser(String userId, TextMessage messageInfo) {
        for (WebSocketSession session : webSocketSet) {
            String sessionUser = (String) session.getAttributes().get("userId");
            //根据用户名去判断用户接收消息的用户
            if (userId.equals(sessionUser)) {
                try {
                    if (session.isOpen()) {
                        synchronized (session) {
                            session.sendMessage(messageInfo);
                        }
                        Logger.info(this, "[WebSocket]======发送消息给:{} 内容: {}", userId, messageInfo.getPayload());
                    }
                    break;
                } catch (IOException e) {
                    Logger.warn(this, "[WebSocket]========发送消息失败,e->{}", ExceptionUtils.getStackTrace(e));
                }
            }
        }
    }