@Override public void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception { if (!session.isClosing()) { // Get number of pending requests long pendingBytes = session.getScheduledWriteBytes(); if (pendingBytes > bytesCap) { // Get last time we were able to send something to the connected client long writeTime = session.getLastWriteTime(); int pendingRequests = session.getScheduledWriteMessages(); Log.debug("About to kill session with pendingBytes: " + pendingBytes + " pendingWrites: " + pendingRequests + " lastWrite: " + new Date(writeTime) + "session: " + session); // Close the session and throw an exception session.close(false); throw new IOException("Closing session that seems to be stalled. Preventing OOM"); } } // Call next filter (everything is fine) super.filterWrite(nextFilter, session, writeRequest); } }
@Override public void exceptionCaught(NextFilter nextFilter, IoSession session, Throwable cause) throws Exception { //verifyInIoThread(session, sessionEx.getIoThread()); super.exceptionCaught(nextFilter, session, cause); }
@Override public void sessionIdle(NextFilter nextFilter, IoSession session, IdleStatus status) throws Exception { // note: *always* propagate session idle super.sessionIdle(nextFilter, session, status); }
@Override public void messageReceived ( final NextFilter nextFilter, final IoSession session, final Object message ) throws Exception { updateStats ( session ); super.messageReceived ( nextFilter, session, message ); }
@Override public void messageSent ( final NextFilter nextFilter, final IoSession session, final WriteRequest writeRequest ) throws Exception { updateStats ( session ); super.messageSent ( nextFilter, session, writeRequest ); } }
@Override public void sessionClosed ( final NextFilter nextFilter, final IoSession session ) throws Exception { this.statsMapper.remove ( session ); super.sessionClosed ( nextFilter, session ); }
@Override public void sessionOpened(NextFilter nextFilter, IoSession session) throws Exception { if (sessionCount.getAndIncrement() == 0) { // there is at least one session now, cancel the heartbeat if (logger.isTraceEnabled()) { logger.trace(format("First session connected to service, cancelling heartbeat for %s", connectURI)); } cancelHeartbeat(); } super.sessionOpened(nextFilter, session); }
IoFilter dummyFilter = new IoFilterAdapter();
@Override public void messageReceived( NextFilter nextFilter, IoSession session, Object message) throws Exception { flushSessionOpenedIfNecessary(nextFilter, session); super.messageReceived(nextFilter, session, message); }
@Override public void messageSent ( final NextFilter nextFilter, final IoSession session, final WriteRequest writeRequest ) throws Exception { updateStats ( session ); super.messageSent ( nextFilter, session, writeRequest ); } }
@Override public void sessionClosed ( final NextFilter nextFilter, final IoSession session ) throws Exception { this.statsMapper.remove ( session ); super.sessionClosed ( nextFilter, session ); }
private void flushSessionOpenedIfNecessary( NextFilter nextFilter, IoSession session) throws Exception { if (sessionOpened.compareAndSet(State.OBSERVED, State.FLUSHED)) { super.sessionOpened(nextFilter, session); session.getFilterChain().remove(this); } } }
IoFilter dummyFilter = new IoFilterAdapter();
@Override public void filterWrite ( final NextFilter nextFilter, final IoSession session, final WriteRequest writeRequest ) throws Exception { updateStats ( session ); super.filterWrite ( nextFilter, session, writeRequest ); }
@Override public void messageReceived ( final NextFilter nextFilter, final IoSession session, final Object message ) throws Exception { updateStats ( session ); super.messageReceived ( nextFilter, session, message ); }
@Override public void messageSent( NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception { flushSessionOpenedIfNecessary(nextFilter, session); super.messageSent(nextFilter, session, writeRequest); }
@Override public void exceptionCaught(NextFilter nextFilter, IoSession session, Throwable cause) throws Exception { // note: *always* propagate exception caught super.exceptionCaught(nextFilter, session, cause); }
@Override public void sessionClosed(NextFilter nextFilter, IoSession session) throws Exception { if (sessionCount.decrementAndGet() == 0) { // the last session is being closed, start the heartbeat again heartbeat.schedule(); } super.sessionClosed(nextFilter, session); }
@Override public void sessionOpened(NextFilter nextFilter, IoSession session) throws Exception { Queue<InboundEvent> inboundEvents = inboundEventsKey.get(session); if (inboundEvents != null) { inboundEvents.add(new SessionOpenedEvent()); } else { super.sessionOpened(nextFilter, session); } }
@Override public void sessionIdle( NextFilter nextFilter, IoSession session, IdleStatus status) throws Exception { flushSessionOpenedIfNecessary(nextFilter, session); super.sessionIdle(nextFilter, session, status); }