IdleStateHandler 开启observeOutput 监控读超时的逻辑是
监控这次发送的entry对象和上一次的是否一致,以及所有待发送的entry对象的字节总数是否一致
netty那边是发完一个entry对象后才删除对应entry对象(entry对象是池化的,所以他的hashcode不是很准确)的字节总数,这样的问题是我们发送fileRegion或者大的Bytebuf对象期间会导致写超时。
而就算换成对没发送一个大循环(默认是16次)就去计算发送的字节数,也会因为后续我们还要添加字节导致
出现ABA的问题。
我的建议是通过ChannelProgressivePromise 来设置值 如果每次不等于0 代表在这期间起码发送了 所以可以不用发送写超时
网友评论