private void dispatch() throws IOException { SelectionKey key = null; for (SocketChannelOPSChangeRequest request : opsChangeRequstMap.values()) { key = request.getChannel().keyFor(selector); if (key != null) { // 写优先 if ((request.getOps() & SelectionKey.OP_WRITE) == SelectionKey.OP_WRITE) { key.interestOps(SelectionKey.OP_WRITE); request.clearOps(SelectionKey.OP_WRITE); } else if ((request.getOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) { key.interestOps(SelectionKey.OP_READ); request.clearOps(SelectionKey.OP_READ); } } } isWeakuped.set(false); if (selector.select(WaveriderConfig.WAVERIDER_DEFAULT_NETWORK_TIME_OUT) <= 0) { return; } Iterator<SelectionKey> iterator = selector.selectedKeys().iterator(); while (iterator.hasNext()) { key = (SelectionKey) iterator.next(); iterator.remove(); try { if (!key.isValid()) { continue; } else if (key.isAcceptable()) { onAccept(key); } else if (key.isReadable()) { // readerExecutor.execute(new NetworkTask(key, NETWORK_OPERATION_READ)); onRead(key); } else if (key.isWritable()) { // writerExecutor.execute(new NetworkTask(key, NETWORK_OPERATION_WRITE)); onWrite(key); } } catch (IOException e) { // 客户端连接出问题 Session session = (Session) key.attachment(); if (session != null) { session.onException(); // 释放Session sessionManager.freeSession(session); } opsChangeRequstMap.remove((SocketChannel) key.channel()); key.cancel(); key.channel().close(); e.printStackTrace(); logger.error("OOPS:Exception:", e); } } }
@Override public void run() { try { switch (operation) { case NETWORK_OPERATION_ACCEPT: { onAccept(key); break; } case NETWORK_OPERATION_READ: { onRead(key); break; } case NETWORK_OPERATION_WRITE: { onWrite(key); break; } } } catch (IOException e) { logger.error("OOPS:Exception:", e); try { // 客户端连接出问题 Session session = (Session) key.attachment(); if (session != null) { session.onException(); // 释放Session sessionManager.freeSession(session); } opsChangeRequstMap.remove((SocketChannel) key.channel()); key.cancel(); key.channel().close(); } catch (IOException ex) { logger.error("OOPS:Exception:", ex); ex.printStackTrace(); } } }