使用ChannelFuture进行异步超时

时间:2018-01-03 18:11:56

标签: multithreading netty future

Netty框架使用ChannelFuture来执行异步I / O操作。

例如,以下方法调用Http2FrameWriter#writeHeaders返回一个ChannelFuture,它将在给定通道上写入标头。这些任务通常在Channel's IO Thread上排队。

ChannelFuture writeHeaders(ChannelHandlerContext ctx,
                           int streamId,
                           Http2Headers headers,
                           int streamDependency,
                           short weight,
                           boolean exclusive,
                           int padding,
                           boolean endStream,
                           ChannelPromise promise)

我已经注册了一个ChannelListener来处理失败的异常,如下所示,但它不包括任何超时。

ChannelFuture channelFuture = ctx.writeHeaders(
        ctx,
        streamId,
        headers,
        0,
        endOfStream,
        ctx.newPromise()
);

channelFuture.addListener((ChannelFutureListener) future -> {
        if (!future.isSuccess()) {
            Throwable cause = future.cause();
            // Do some error handling
        }
    });  

以前,我使用过Java 8的CompleteableFuture,它允许指定异步超时以及Asynchronous Timeouts with CompletableFuture中描述的异常处理。

是否可以对ChannelFuture做同样的事情?

1 个答案:

答案 0 :(得分:0)

您只需提交在未完成写入的特定超时后运行的任务。

这样的事情:

ChannelFuture future = ctx.writeAndFlush(msg);
if (!future.isDone()) {
    Future<?> scheduled = ctx.executor().schedule(() -> {
        if (!future.isDone()) {
            // Do something as the write did not complete yet.
        }

    }
    future.addListener(f -> {
        scheduled.cancel();
    })
}

同时检查以通用方式完成此操作的WriteTimeoutHandler