10 March 2016

一个使用websocket来推送数据的项目,在修改了css的情况下,刷新页面来看看效果的时候碰到了。。 然后就出现了这个错误。 主要思路是建立一个List来保存session,推送的时候遍历session推送数据。

具体代码如下:

	private static final List<Session> WEB_SOCKET_SESSIONS = new ArrayList<Session>();
	
    	@OnOpen
	public void onOpen(Session session, EndpointConfig config) {
		WEB_SOCKET_SESSIONS.add(session);
		logger.info("WebSocket 客户端 " + session.getId() + " 已连接, 当前连接数:" + WEB_SOCKET_SESSIONS.size());
	}

	@OnClose
	public void onClose(Session session) {
		WEB_SOCKET_SESSIONS.remove(session);
		logger.info("WebSocket 客户端 " + session.getId() + " 被关闭, 当前连接数:" + WEB_SOCKET_SESSIONS.size());
	}
    
  public void push(Object data){
 for (Session s : WEB_SOCKET_SESSIONS) {
				try {
					s.getBasicRemote().sendText(JSON.toJSONString(data));
				} catch (IOException e) {
					e.printStackTrace();
				}
			}	
            }

然后思考了一下,每次刷新页面都会导致List移除一次,再添加一次。自然也就改变了list的内容,所以导致了fail-fast.

修改之后的代码如下:

	private static void push(Object content,String type){
		Map<String,Object> data = new HashMap<String,Object>();
		data.put("type", type);
		data.put("data", content);
		try{
			for (Session s : WEB_SOCKET_SESSIONS) {
				try {
					s.getBasicRemote().sendText(JSON.toJSONString(data));
				} catch (IOException e) {
					e.printStackTrace();
				}
			}	
		}catch(ConcurrentModificationException e){
			//什么也不做,因为前台刷新或者关闭页面,导致sessions数量变化
		}
		
	}