1

我们使用的是Netty 3.2.3版本,想根据一定的计算关闭通道写入。

我们通过以下方式关闭频道:

channel.setInterestOps(channel.getInterestOps() | Channel.OP_WRITE);

并通过以下方式重新打开它:

channel.setInterestOps(channel.getInterestOps() & Channel.OP_WRITE);

但根据表现,有些不对劲。计算与我们进行 serReadable true/false 相同,可以正常工作。

4

1 回答 1

1

Channel.OP_WRITE 仅供参考。Netty 使用它来指示 I/O 线程是否可以立即将数据写入通道。如果 channel.isWritable() 为假,那么 Netty 将排队任何进一步的数据,直到它可以被通道接受。如果您在 isWritable() 为 false 时继续写入数据,那么您最终可能会遇到 OutOfMemoryError。

我假设您不想真正关闭频道,只需停止写入即可。正确的方法是在每次发送后检查 channel.isWritable(),或者接收 ChannelStateEvent(可能通过覆盖 SimpleChannelUpstreamHandler.channelInterestChanged())并暂停正在将数据写入通道的任何应用程序进程。

无论哪种情况,您都希望收到 ChannelStateEvent 以了解何时可以再次开始写入通道。

于 2011-11-07T11:20:08.463 回答