如何处理Netty“上次写入尝试超时;强行关闭连接”。例外?

时间:2018-03-17 15:45:42

标签: netty

最近部署后,我在生产服务器上发现了很多这样的错误:

  

上次写入尝试超时;强制关闭连接。

目前我每小时从不同的主机收到约5个这样的错误。 我查看了Netty SslHandler中的代码,看到当close_notify事件没有完全发送到接收者时(根据评论),预计会出现此异常。

但是,我之前从未见过这个错误。这让我觉得它可能是某种错误的管道配置问题。所以目前,我不确定这是我的错误还是网络问题。

Netty版本4.1.22.Final

epoll和ssl启用了netty-tcnative-boringssl-static 2.0.7.Final

我做了很少的单元测试,但没有运气。

有人有线索吗?

2 个答案:

答案 0 :(得分:1)

除了更高的超时之外,你无能为力。这意味着您无法足够快地将数据写入远程对等方,这很可能意味着远程对等方读取速度不够快。另一个原因可能是您阻止了EventLoop,因此无法及时取得任何进展。

答案 1 :(得分:0)

经过一番调查,我能够解决问题。似乎问题出在管道配置中。

有错误的管道:

.addLast(new IdleStateHandler(appIdleTimeout, 0, 0))
.addLast(sslCtx.newHandler(ch.alloc()))
.addLast(appChannelStateHandler);

没有问题的管道:

.addLast(new IdleStateHandler(appIdleTimeout, 0, 0))
.addLast(appChannelStateHandler)
.addLast(sslCtx.newHandler(ch.alloc()))

appChannelStateHandler ChannelInboundHandlerAdapter的位置:

@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
    if (evt instanceof IdleStateEvent) {
        log.trace("State handler. App timeout disconnect. Event : {}. Closing.", ((IdleStateEvent) evt).state());
        ctx.close();
    } else {
        ctx.fireUserEventTriggered(evt);
    }
}

问题可能是ctx.close();SslHandler都调用appChannelStateHandler。至少这是首先想到的。我仍然不确定 - 是netty问题还是错误的管道配置?无论如何,我无法在本地重现这个问题。