public IoSessionChannelHandler(ChannelIoSession<? extends ChannelConfig> session, IoFuture future, IoSessionInitializer<?> initializer, IoSessionIdleTracker idleTracker) { this.session = session; this.allocator = session.getBufferAllocator(); this.future = future; this.initializer = initializer; this.idleTracker = idleTracker; }
protected void destroy(ChannelIoSession<? extends ChannelConfig> session) { session.getChannel().close(); }
@Override public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { idleTracker.removeSession(session); // Processor remove takes care of firing sessionClosed on the filter chain. if (session.isIoRegistered()) { if (currentThread() == session.getIoThread()) { session.getProcessor().remove(session); } else { // This race can occur because org.jboss.netty.channel.socket.nio.AbstractNioChannel.setWorker // only schedules a task to unregister or register instead of doing it immediately session.getIoExecutor().execute(new Runnable() { @Override public void run() { session.getProcessor().remove(session); } }); } } else { // session is being realigned (by calls to setIoAlignment), defer closed processing // to when we have an operational io executor session.setClosedReceived(); } }
@Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { session.getService().initializeSession(session, future, initializer); idleTracker.addSession(session); session.getProcessor().add(session); }
private boolean flushNow(ChannelIoSession<? extends ChannelConfig> session) { if (!session.isConnected()) { removeNow(session); return false; final WriteRequestQueue writeRequestQueue = session.getWriteRequestQueue(); final Channel channel = session.getChannel(); final IoFilterChain filterChain = session.getFilterChain(); WriteRequest req = null;
private void clearWriteRequestQueue(ChannelIoSession<? extends ChannelConfig> session) { WriteRequestQueue writeRequestQueue = session.getWriteRequestQueue(); WriteRequest req; failedRequests.add(req); } else { IoFilterChain filterChain = session.getFilterChain(); filterChain.fireMessageSent(req); session.decreaseScheduledBytesAndMessages(r); r.getFuture().setException(cause); IoFilterChain filterChain = session.getFilterChain(); filterChain.fireExceptionCaught(cause);
private boolean removeNow(ChannelIoSession<? extends ChannelConfig> session) { clearWriteRequestQueue(session); try { destroy(session); return true; } catch (Exception e) { IoFilterChain filterChain = session.getFilterChain(); filterChain.fireExceptionCaught(e); } finally { clearWriteRequestQueue(session); session.getService().getListeners() .fireSessionDestroyed(session); } return false; }
@Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { if (!alreadyFiredIoExceptionCaught) { // filter chain can change if session is re-aligned IoFilterChain filterChain = session.getFilterChain(); filterChain.fireExceptionCaught(e.getCause()); Throwable cause = e.getCause(); if (cause instanceof IOException) { alreadyFiredIoExceptionCaught = true; } } }
@Override public void writeComplete(ChannelHandlerContext ctx, WriteCompletionEvent e) throws Exception { int writtenBytes = (int) e.getWrittenAmount(); session.increaseWrittenBytes(writtenBytes, currentTimeMillis()); }
@Override public void run() { session.getProcessor().remove(session); }
private void addNow(ChannelIoSession<? extends ChannelConfig> session) { try { init(session); // Build the filter chain of this session. IoFilterChainBuilder chainBuilder = session.getService().getFilterChainBuilder(); chainBuilder.buildFilterChain(session.getFilterChain()); // DefaultIoFilterChain.CONNECT_FUTURE is cleared inside here // in AbstractIoFilterChain.fireSessionOpened(). // Propagate the SESSION_CREATED event up to the chain IoServiceListenerSupport listeners = session.getService().getListeners(); listeners.fireSessionCreated(session); } catch (Throwable e) { ExceptionMonitor.getInstance().exceptionCaught(e, session); try { destroy(session); } catch (Exception e1) { ExceptionMonitor.getInstance().exceptionCaught(e1, session); } } }
@Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { Object message = e.getMessage(); if (message instanceof ChannelBuffer) { ChannelBuffer buf = (ChannelBuffer) message; // note: read as unshared buffer // can convert via IoBufferEx.asSharedBuffer() if necessary later message = allocator.wrap(buf.toByteBuffer()); buf.skipBytes(buf.readableBytes()); } // filter chain can change if session is re-aligned IoFilterChain filterChain = session.getFilterChain(); filterChain.fireMessageReceived(message); }