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做同样的事情?
答案 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
。