public class FlushConsolidationHandler extends ChannelDuplexHandler
ChannelDuplexHandler
which consolidates Channel.flush()
/ ChannelHandlerContext.flush()
operations (which also includes
ChannelOutboundInvoker.writeAndFlush(Object)
/ ChannelOutboundInvoker.writeAndFlush(Object, ChannelPromise)
and
ChannelOutboundInvoker.writeAndFlush(Object)
/
ChannelOutboundInvoker.writeAndFlush(Object, ChannelPromise)
).
Flush operations are generally speaking expensive as these may trigger a syscall on the transport level. Thus it is in most cases (where write latency can be traded with throughput) a good idea to try to minimize flush operations as much as possible.
If a read loop is currently ongoing, flush(ChannelHandlerContext)
will not be passed on to the next
ChannelOutboundHandler
in the ChannelPipeline
, as it will pick up any pending flushes when
channelReadComplete(ChannelHandlerContext)
is triggered.
If no read loop is ongoing, the behavior depends on the consolidateWhenNoReadInProgress
constructor argument:
false
, flushes are passed on to the next handler directly;true
, the invocation of the next handler is submitted as a separate task on the event loop. Under
high throughput, this gives the opportunity to process other flushes before the task gets executed, thus
batching multiple flushes into one.explicitFlushAfterFlushes
is reached the flush will be forwarded as well (whether while in a read loop, or
while batching outside of a read loop).
If the Channel
becomes non-writable it will also try to execute any pending flush operations.
The FlushConsolidationHandler
should be put as first ChannelHandler
in the
ChannelPipeline
to have the best effect.
ChannelHandler.Sharable
Modifier and Type | Field and Description |
---|---|
static int |
DEFAULT_EXPLICIT_FLUSH_AFTER_FLUSHES
The default number of flushes after which a flush will be forwarded to downstream handlers (whether while in a
read loop, or while batching outside of a read loop).
|
Constructor and Description |
---|
FlushConsolidationHandler()
Create new instance which explicit flush after 256 pending flush
operations at the latest.
|
FlushConsolidationHandler(int explicitFlushAfterFlushes)
Create new instance which doesn't consolidate flushes when no read is in progress.
|
FlushConsolidationHandler(int explicitFlushAfterFlushes,
boolean consolidateWhenNoReadInProgress)
Create new instance.
|
bind, connect, deregister, read, write
channelActive, channelInactive, channelRegistered, channelUnregistered, userEventTriggered
ensureNotSharable, isSharable
public static final int DEFAULT_EXPLICIT_FLUSH_AFTER_FLUSHES
public FlushConsolidationHandler()
public FlushConsolidationHandler(int explicitFlushAfterFlushes)
explicitFlushAfterFlushes
- the number of flushes after which an explicit flush will be done.public FlushConsolidationHandler(int explicitFlushAfterFlushes, boolean consolidateWhenNoReadInProgress)
explicitFlushAfterFlushes
- the number of flushes after which an explicit flush will be done.consolidateWhenNoReadInProgress
- whether to consolidate flushes even when no read loop is currently
ongoing.public void handlerAdded(ChannelHandlerContext ctx) throws Exception
ChannelHandlerAdapter
handlerAdded
in interface ChannelHandler
handlerAdded
in class ChannelHandlerAdapter
Exception
public void flush(ChannelHandlerContext ctx) throws Exception
ChannelDuplexHandler
ChannelHandlerContext.flush()
to forward
to the next ChannelOutboundHandler
in the ChannelPipeline
.
Sub-classes may override this method to change behavior.flush
in interface ChannelOutboundHandler
flush
in class ChannelDuplexHandler
ctx
- the ChannelHandlerContext
for which the flush operation is madeException
- thrown if an error occurspublic void channelReadComplete(ChannelHandlerContext ctx) throws Exception
ChannelInboundHandlerAdapter
ChannelHandlerContext.fireChannelReadComplete()
to forward
to the next ChannelInboundHandler
in the ChannelPipeline
.
Sub-classes may override this method to change behavior.channelReadComplete
in interface ChannelInboundHandler
channelReadComplete
in class ChannelInboundHandlerAdapter
Exception
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception
ChannelInboundHandlerAdapter
ChannelHandlerContext.fireChannelRead(Object)
to forward
to the next ChannelInboundHandler
in the ChannelPipeline
.
Sub-classes may override this method to change behavior.channelRead
in interface ChannelInboundHandler
channelRead
in class ChannelInboundHandlerAdapter
Exception
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception
ChannelInboundHandlerAdapter
ChannelHandlerContext.fireExceptionCaught(Throwable)
to forward
to the next ChannelHandler
in the ChannelPipeline
.
Sub-classes may override this method to change behavior.exceptionCaught
in interface ChannelHandler
exceptionCaught
in interface ChannelInboundHandler
exceptionCaught
in class ChannelInboundHandlerAdapter
Exception
public void disconnect(ChannelHandlerContext ctx, ChannelPromise promise) throws Exception
ChannelDuplexHandler
ChannelOutboundInvoker.disconnect(ChannelPromise)
to forward
to the next ChannelOutboundHandler
in the ChannelPipeline
.
Sub-classes may override this method to change behavior.disconnect
in interface ChannelOutboundHandler
disconnect
in class ChannelDuplexHandler
ctx
- the ChannelHandlerContext
for which the disconnect operation is madepromise
- the ChannelPromise
to notify once the operation completesException
- thrown if an error occurspublic void close(ChannelHandlerContext ctx, ChannelPromise promise) throws Exception
ChannelDuplexHandler
ChannelOutboundInvoker.close(ChannelPromise)
to forward
to the next ChannelOutboundHandler
in the ChannelPipeline
.
Sub-classes may override this method to change behavior.close
in interface ChannelOutboundHandler
close
in class ChannelDuplexHandler
ctx
- the ChannelHandlerContext
for which the close operation is madepromise
- the ChannelPromise
to notify once the operation completesException
- thrown if an error occurspublic void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception
ChannelInboundHandlerAdapter
ChannelHandlerContext.fireChannelWritabilityChanged()
to forward
to the next ChannelInboundHandler
in the ChannelPipeline
.
Sub-classes may override this method to change behavior.channelWritabilityChanged
in interface ChannelInboundHandler
channelWritabilityChanged
in class ChannelInboundHandlerAdapter
Exception
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception
ChannelHandlerAdapter
handlerRemoved
in interface ChannelHandler
handlerRemoved
in class ChannelHandlerAdapter
Exception
Copyright © 2008–2024 The Netty Project. All rights reserved.