gpt4 book ai didi

java - 如何在 Netty 中取消写入超时?

转载 作者:行者123 更新时间:2023-11-29 08:58:47 25 4
gpt4 key购买 nike

我正在使用 Netty 3.6.6.Final 并尝试为我的处理程序实现写超时,以便在超时时我需要编写特定的响应。此外,我需要取消另一个正在管道中执行(或将要执行)的写响应。

这是我目前的管道:

bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
return Channels.pipeline(LOGGER,
new HttpServerCodec(),
new MyHttpContentDecoder(),
new IdleStateHandler(timer, 0, 1000, 0, TimeUnit.MILLISECONDS),
handler.get());
}
});

Handler 扩展 IdleStateAwareChannelHandler 并实现 channelIdle 方法,我在其中检查写入超时:

if (e.getState() == IdleState.WRITER_IDLE) {
e.getChannel().write(SOME_RESPONSE).addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) throws Exception {
future.getChannel().close();
}});
}

问题是如果没有发生超时,我如何取消我在 messageReceived 方法中计划的写入。 Netty有没有什么习惯来处理这样的问题?

编辑

通过 ChannelFuture 取消无效。据我了解,大部分时间 write 不会被取消。在我的测试中,它一直都是,即 cancel() 总是返回 false。所以我想以这种方式实现它真的很难。

最后,我将代码更新到最新版本 - 4.0.9.Final(更好的 API)。突然之间,由于写入超时,我收到了回复。这在 3.6.6.Final 中不起作用。

在 4.0.9.Final 中,处理写入超时的代码有点不同,但我总是在超时时得到第二次写入(如果我在下面评论 ctx.writeAndFlush,那么我正在从channelRead0):

public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
IdleStateEvent e = (IdleStateEvent) evt;
if (e.state() == IdleState.WRITER_IDLE) {

//the following condition was always false
//(channelFuture is a state variable of my handler for previous write)
if (channelFuture != null && channelFuture.isCancellable()) {
System.out.println("Cancel "+channelFuture.cancel(true));
}

ctx.writeAndFlush(SOME_RESPONSE);

}
}
}

不知道在发生超时时“覆盖”第一次写入尝试是否是正确的方法,如果有人能解释它为什么有效以及在最新版本中关于这种情况的更改,我们将很高兴。

最佳答案

当消息被刷新时,promise 被设置为不可取消。一旦消息写出一个字节,就必须将其完整写入,以便解码器可以处理基于流的传输

关于java - 如何在 Netty 中取消写入超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18744981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com