Home / Class/ WriteTimeoutHandler Class — netty Architecture

WriteTimeoutHandler Class — netty Architecture

Architecture documentation for the WriteTimeoutHandler class in WriteTimeoutHandler.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  7b2e459e_2db3_bea4_7583_d545431cfb47["WriteTimeoutHandler"]
  2b552d7b_2e84_2905_efd6_2d637843dd63["WriteTimeoutHandler.java"]
  7b2e459e_2db3_bea4_7583_d545431cfb47 -->|defined in| 2b552d7b_2e84_2905_efd6_2d637843dd63
  ada7fb06_4273_e9d7_d037_92424a7f7cb8["WriteTimeoutHandler()"]
  7b2e459e_2db3_bea4_7583_d545431cfb47 -->|method| ada7fb06_4273_e9d7_d037_92424a7f7cb8
  7ed311c8_061c_9835_d304_df9aa39d3a34["write()"]
  7b2e459e_2db3_bea4_7583_d545431cfb47 -->|method| 7ed311c8_061c_9835_d304_df9aa39d3a34
  4f267b1a_7e0e_daab_c3f0_697a0a5e5135["handlerRemoved()"]
  7b2e459e_2db3_bea4_7583_d545431cfb47 -->|method| 4f267b1a_7e0e_daab_c3f0_697a0a5e5135
  2b53a7eb_61bd_a249_aad8_257450c6dd22["scheduleTimeout()"]
  7b2e459e_2db3_bea4_7583_d545431cfb47 -->|method| 2b53a7eb_61bd_a249_aad8_257450c6dd22
  0db099ef_ff56_5d35_0390_5b916332e663["addWriteTimeoutTask()"]
  7b2e459e_2db3_bea4_7583_d545431cfb47 -->|method| 0db099ef_ff56_5d35_0390_5b916332e663
  a29cd7e7_658b_eddc_cda5_3a2f3771e34e["removeWriteTimeoutTask()"]
  7b2e459e_2db3_bea4_7583_d545431cfb47 -->|method| a29cd7e7_658b_eddc_cda5_3a2f3771e34e
  043f5eaa_2242_aa7e_eb93_13a5893c806d["writeTimedOut()"]
  7b2e459e_2db3_bea4_7583_d545431cfb47 -->|method| 043f5eaa_2242_aa7e_eb93_13a5893c806d

Relationship Graph

Source Code

handler/src/main/java/io/netty/handler/timeout/WriteTimeoutHandler.java lines 66–236

public class WriteTimeoutHandler extends ChannelOutboundHandlerAdapter {
    private static final long MIN_TIMEOUT_NANOS = TimeUnit.MILLISECONDS.toNanos(1);

    private final long timeoutNanos;

    /**
     * A doubly-linked list to track all WriteTimeoutTasks
     */
    private WriteTimeoutTask lastTask;

    private boolean closed;

    /**
     * Creates a new instance.
     *
     * @param timeoutSeconds
     *        write timeout in seconds
     */
    public WriteTimeoutHandler(int timeoutSeconds) {
        this(timeoutSeconds, TimeUnit.SECONDS);
    }

    /**
     * Creates a new instance.
     *
     * @param timeout
     *        write timeout
     * @param unit
     *        the {@link TimeUnit} of {@code timeout}
     */
    public WriteTimeoutHandler(long timeout, TimeUnit unit) {
        ObjectUtil.checkNotNull(unit, "unit");

        if (timeout <= 0) {
            timeoutNanos = 0;
        } else {
            timeoutNanos = Math.max(unit.toNanos(timeout), MIN_TIMEOUT_NANOS);
        }
    }

    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
        if (timeoutNanos > 0) {
            promise = promise.unvoid();
            scheduleTimeout(ctx, promise);
        }
        ctx.write(msg, promise);
    }

    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        assert ctx.executor().inEventLoop();
        WriteTimeoutTask task = lastTask;
        lastTask = null;
        while (task != null) {
            assert task.ctx.executor().inEventLoop();
            task.scheduledFuture.cancel(false);
            WriteTimeoutTask prev = task.prev;
            task.prev = null;
            task.next = null;
            task = prev;
        }
    }

    private void scheduleTimeout(final ChannelHandlerContext ctx, final ChannelPromise promise) {
        // Schedule a timeout.
        final WriteTimeoutTask task = new WriteTimeoutTask(ctx, promise);
        task.scheduledFuture = ctx.executor().schedule(task, timeoutNanos, TimeUnit.NANOSECONDS);

        if (!task.scheduledFuture.isDone()) {
            addWriteTimeoutTask(task);

            // Cancel the scheduled timeout if the flush promise is complete.
            promise.addListener(task);
        }
    }

    private void addWriteTimeoutTask(WriteTimeoutTask task) {
        assert task.ctx.executor().inEventLoop();
        if (lastTask != null) {
            lastTask.next = task;

Frequently Asked Questions

What is the WriteTimeoutHandler class?
WriteTimeoutHandler is a class in the netty codebase, defined in handler/src/main/java/io/netty/handler/timeout/WriteTimeoutHandler.java.
Where is WriteTimeoutHandler defined?
WriteTimeoutHandler is defined in handler/src/main/java/io/netty/handler/timeout/WriteTimeoutHandler.java at line 66.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free