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

标签 java timeout netty

我正在使用 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/

相关文章:

java - 2010 年中小型 Web 应用程序使用哪种 Java 报告工具

java - 为什么 System.out.println 必须在方法内部?

c# - WCF: "Failed to open System.ServiceModel.Channels.ClientReliableDuplexSessionChannel"

Netty:HTTP 内容长度超过 64K 时出错

java - 如果我已经添加了 Maven 依赖项,我缺少什么能够导入 io.netty.handler.ssl.util.* ?

java - 无法找到窗口 - Selenium Webdriver 错误

java - 我无法向 Android 谷歌地图添加多于一条线(覆盖)?

php - 多次运行后 CURL 失败,显示 "could not establish connection"或 "connect() timed out"

http - 我不知道用于 av_dict_set 设置超时的时间单位

java - Netty服务端RTSP交错RTP(解码处理)