2

我正在使用 Netty Channels,当通过通道发送大量数据时,我注意到该Channel.channelInterestChanged事件被触发,这立即导致Channel.isWritable()返回 false。(有另一个线程在执行 aChannel.write()并且该线程立即失败)。我的问题是:为什么频道的兴趣会发生变化?或者更确切地说,是谁在改变它?我编写的代码(服务器或客户端)中的任何内容都不会改变兴趣。

4

1 回答 1

3

它会发生变化,因为您将更多数据写入通道,然后它可以在给定时间内传输。Netty 为您排队数据,直到达到某个阈值,一旦达到,Channel.isWritable() 将返回 false。

如果您想在 Channel.isWritable() 返回 false 之前更改允许排队/缓冲的字节数,则必须调整 writeBufferHighWaterMark 和 writeBufferLowWaterMark。

ServerBootstrap sb = ....
sb.setOption("writeBufferHighWaterMark", ..);
sb.setOption("writeBufferLowWaterMark", ..);

无论如何,您应该确保调用 Channel.write(...) 的代码确实检查 Channel.isWritable() 并且只有在它返回 true 时才写入。您遇到的问题经常出现在慢速网络中。

[1] http://netty.io/docs/stable/api/org/jboss/netty/channel/socket/nio/NioChannelConfig.html

于 2012-04-13T06:00:32.387 回答