Class FlushConsolidationHandler

  • All Implemented Interfaces:
    io.netty5.channel.ChannelHandler

    public class FlushConsolidationHandler
    extends Object
    implements io.netty5.channel.ChannelHandler
    ChannelHandler which consolidates Channel.flush() / ChannelHandlerContext.flush() operations (which also includes Channel.writeAndFlush(Object) and ChannelOutboundInvoker.writeAndFlush(Object).

    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, ChannelHandler.flush(ChannelHandlerContext) will not be passed on to the next ChannelHandler 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:

    • 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.
    If 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.

    • Nested Class Summary

      • Nested classes/interfaces inherited from interface io.netty5.channel.ChannelHandler

        io.netty5.channel.ChannelHandler.Sharable
    • Field Summary

      Fields 
      Modifier and Type Field 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 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.
    • 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.netty5.channel.ChannelHandlerContext ctx)
                          throws Exception
        Specified by:
        handlerAdded in interface io.netty5.channel.ChannelHandler
        Throws:
        Exception
      • flush

        public void flush​(io.netty5.channel.ChannelHandlerContext ctx)
        Specified by:
        flush in interface io.netty5.channel.ChannelHandler
      • channelReadComplete

        public void channelReadComplete​(io.netty5.channel.ChannelHandlerContext ctx)
                                 throws Exception
        Specified by:
        channelReadComplete in interface io.netty5.channel.ChannelHandler
        Throws:
        Exception
      • channelRead

        public void channelRead​(io.netty5.channel.ChannelHandlerContext ctx,
                                Object msg)
                         throws Exception
        Specified by:
        channelRead in interface io.netty5.channel.ChannelHandler
        Throws:
        Exception
      • exceptionCaught

        public void exceptionCaught​(io.netty5.channel.ChannelHandlerContext ctx,
                                    Throwable cause)
                             throws Exception
        Specified by:
        exceptionCaught in interface io.netty5.channel.ChannelHandler
        Throws:
        Exception
      • disconnect

        public io.netty5.util.concurrent.Future<Void> disconnect​(io.netty5.channel.ChannelHandlerContext ctx)
        Specified by:
        disconnect in interface io.netty5.channel.ChannelHandler
      • close

        public io.netty5.util.concurrent.Future<Void> close​(io.netty5.channel.ChannelHandlerContext ctx)
        Specified by:
        close in interface io.netty5.channel.ChannelHandler
      • channelWritabilityChanged

        public void channelWritabilityChanged​(io.netty5.channel.ChannelHandlerContext ctx)
                                       throws Exception
        Specified by:
        channelWritabilityChanged in interface io.netty5.channel.ChannelHandler
        Throws:
        Exception
      • handlerRemoved

        public void handlerRemoved​(io.netty5.channel.ChannelHandlerContext ctx)
                            throws Exception
        Specified by:
        handlerRemoved in interface io.netty5.channel.ChannelHandler
        Throws:
        Exception