@Override public void channelRead(ChannelHandlerContext ctx, Object message) throws Exception { if (acceptInboundMessage(message)) { switch (state) { case IDLE: buffer.add(message); state = BUFFERING; break; case NO_SUBSCRIBER: case BUFFERING: buffer.add(message); break; case DEMANDING: publishMessage(message); break; case DRAINING: case DONE: ReferenceCountUtil.release(message); break; case NO_CONTEXT: case NO_SUBSCRIBER_OR_CONTEXT: throw new IllegalStateException("Message received before added to the channel context"); } } else { ctx.fireChannelRead(message); } }