The remote endpoint was in state [TEXT_PARTIAL_WRITING] which is an invalid stat e for called method

其实原因就是: handlerA和handlerB两个方法有可能同时执行,当A或者B方法遍历到某一个session并且调用sendMessage发送消息的时候,另外一个方法也正好也在使用相同的session发送另外一个消息(同一个session消息发送冲突了,也就是说同一个时刻,多个线程向一个socket写数据冲突了),就会报上面的异常。

解决方法其实很简单,就是在发送消息的时候加上一把锁,(保证一个session在某个时刻不会被调用多次):
 

    /**
     * 发送信息给指定用户
     * @param clientId
     * @param message
     * @return
     */
    public  boolean sendMessageToUser(String clientId, TextMessage message) {
    	WebSocketSession session = socketMap.get(clientId);
    	if(session==null) {
    		return false;
    	}
    	if (!session.isOpen()) {
    		return false;
        }
    	try {
    		synchronized (session) {
    			session.sendMessage(message);
    		}
		} catch (IOException e) {
			e.printStackTrace();
		}
        return true;
    }
    /**
     * 广播消息出去
     * @param message
     * @return
     */
    public void sendMessageToAll(TextMessage message) {
    	for (WebSocketSession session : socketMap.values()) {
    		if(session==null||!session.isOpen()) {
        		continue;
        	}
    		try {
    			synchronized (session) {
    				session.sendMessage(message);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
		}
    }

猜你喜欢

转载自blog.csdn.net/zhuwei_clark/article/details/83895287