Class FlushConsolidationHandler
- java.lang.Object
-
- io.netty.channel.ChannelHandlerAdapter
-
- io.netty.channel.ChannelInboundHandlerAdapter
-
- io.netty.channel.ChannelDuplexHandler
-
- io.netty.handler.flush.FlushConsolidationHandler
-
- All Implemented Interfaces:
io.netty.channel.ChannelHandler,io.netty.channel.ChannelInboundHandler,io.netty.channel.ChannelOutboundHandler
public class FlushConsolidationHandler extends io.netty.channel.ChannelDuplexHandlerChannelDuplexHandlerwhich consolidatesChannel.flush()/ChannelHandlerContext.flush()operations (which also includesChannel.writeAndFlush(Object)/Channel.writeAndFlush(Object, ChannelPromise)andChannelOutboundInvoker.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 nextChannelOutboundHandlerin theChannelPipeline, as it will pick up any pending flushes whenchannelReadComplete(ChannelHandlerContext)is triggered. If no read loop is ongoing, the behavior depends on theconsolidateWhenNoReadInProgressconstructor argument:- if
false, flushes are passed on to the next handler directly; - if
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.
explicitFlushAfterFlushesis reached the flush will be forwarded as well (whether while in a read loop, or while batching outside of a read loop).If the
Channelbecomes non-writable it will also try to execute any pending flush operations.The
FlushConsolidationHandlershould be put as firstChannelHandlerin theChannelPipelineto have the best effect.
-
-
Field Summary
Fields Modifier and Type Field Description static intDEFAULT_EXPLICIT_FLUSH_AFTER_FLUSHESThe 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 Summary
Constructors Constructor 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.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidchannelRead(io.netty.channel.ChannelHandlerContext ctx, Object msg)voidchannelReadComplete(io.netty.channel.ChannelHandlerContext ctx)voidchannelWritabilityChanged(io.netty.channel.ChannelHandlerContext ctx)voidclose(io.netty.channel.ChannelHandlerContext ctx, io.netty.channel.ChannelPromise promise)voiddisconnect(io.netty.channel.ChannelHandlerContext ctx, io.netty.channel.ChannelPromise promise)voidexceptionCaught(io.netty.channel.ChannelHandlerContext ctx, Throwable cause)voidflush(io.netty.channel.ChannelHandlerContext ctx)voidhandlerAdded(io.netty.channel.ChannelHandlerContext ctx)voidhandlerRemoved(io.netty.channel.ChannelHandlerContext ctx)-
Methods inherited from class io.netty.channel.ChannelDuplexHandler
bind, connect, deregister, read, write
-
-
-
-
Field Detail
-
DEFAULT_EXPLICIT_FLUSH_AFTER_FLUSHES
public static final 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).- See Also:
- Constant Field Values
-
-
Constructor Detail
-
FlushConsolidationHandler
public FlushConsolidationHandler()
Create new instance which explicit flush after 256 pending flush operations at the latest.
-
FlushConsolidationHandler
public FlushConsolidationHandler(int explicitFlushAfterFlushes)
Create new instance which doesn't consolidate flushes when no read is in progress.- Parameters:
explicitFlushAfterFlushes- the number of flushes after which an explicit flush will be done.
-
FlushConsolidationHandler
public FlushConsolidationHandler(int explicitFlushAfterFlushes, boolean consolidateWhenNoReadInProgress)Create new instance.- Parameters:
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.
-
-
Method Detail
-
handlerAdded
public void handlerAdded(io.netty.channel.ChannelHandlerContext ctx) throws Exception- Specified by:
handlerAddedin interfaceio.netty.channel.ChannelHandler- Overrides:
handlerAddedin classio.netty.channel.ChannelHandlerAdapter- Throws:
Exception
-
flush
public void flush(io.netty.channel.ChannelHandlerContext ctx) throws Exception- Specified by:
flushin interfaceio.netty.channel.ChannelOutboundHandler- Overrides:
flushin classio.netty.channel.ChannelDuplexHandler- Throws:
Exception
-
channelReadComplete
public void channelReadComplete(io.netty.channel.ChannelHandlerContext ctx) throws Exception- Specified by:
channelReadCompletein interfaceio.netty.channel.ChannelInboundHandler- Overrides:
channelReadCompletein classio.netty.channel.ChannelInboundHandlerAdapter- Throws:
Exception
-
channelRead
public void channelRead(io.netty.channel.ChannelHandlerContext ctx, Object msg) throws Exception- Specified by:
channelReadin interfaceio.netty.channel.ChannelInboundHandler- Overrides:
channelReadin classio.netty.channel.ChannelInboundHandlerAdapter- Throws:
Exception
-
exceptionCaught
public void exceptionCaught(io.netty.channel.ChannelHandlerContext ctx, Throwable cause) throws Exception- Specified by:
exceptionCaughtin interfaceio.netty.channel.ChannelHandler- Specified by:
exceptionCaughtin interfaceio.netty.channel.ChannelInboundHandler- Overrides:
exceptionCaughtin classio.netty.channel.ChannelInboundHandlerAdapter- Throws:
Exception
-
disconnect
public void disconnect(io.netty.channel.ChannelHandlerContext ctx, io.netty.channel.ChannelPromise promise) throws Exception- Specified by:
disconnectin interfaceio.netty.channel.ChannelOutboundHandler- Overrides:
disconnectin classio.netty.channel.ChannelDuplexHandler- Throws:
Exception
-
close
public void close(io.netty.channel.ChannelHandlerContext ctx, io.netty.channel.ChannelPromise promise) throws Exception- Specified by:
closein interfaceio.netty.channel.ChannelOutboundHandler- Overrides:
closein classio.netty.channel.ChannelDuplexHandler- Throws:
Exception
-
channelWritabilityChanged
public void channelWritabilityChanged(io.netty.channel.ChannelHandlerContext ctx) throws Exception- Specified by:
channelWritabilityChangedin interfaceio.netty.channel.ChannelInboundHandler- Overrides:
channelWritabilityChangedin classio.netty.channel.ChannelInboundHandlerAdapter- Throws:
Exception
-
-