0

我们希望将 tcp 流控制作为新 java nio 库的主要组件。它会像这样工作......

  1. 库将数据触发到 Listener.incomingData(DataChunk dataChunk);
  2. 在调用 dataChunk.processed() 之前,即使有任何数据,库也不会再触发任何数据。
  3. 通常,您可以在前几个 dataChunk 上调用 processes() 方法,但在某些消息的最后一个上,您写入某个远程套接字并给它一个回调处理程序。
  4. 一旦调用了 write 回调,您就调用最后一个 dataChunk.processed() 以再次解除 tcp 流控制

大注意:如果您没有从 nic 缓冲区读取,第 2 步是 tcp 流控制自动启动的地方。这都是自动的(我们使用 java nio 对其进行了测试)。但问题是我们如何将密钥置于轮询器停止释放并等待除此之外的所有其他套接字上的数据的状态。我不介意它是否在有新数据时发布,因为我们会看到最后一个 dataChunk 尚未处理并忽略它,但我们不希望轮询线程循环 100% cpu。有没有办法实现这一点,这样我们就可以使用这个潜在的开源 nio 框架为任何服务器实现自动节流。

4

2 回答 2

1

不,选择器将查看它们的内部状态而不是来自系统的事件,因此当键设置为感知可读数据时,当数据在缓冲区中等待读取时,它将始终返回。

你有三个选择

从缓冲区读取数据并在本地存储,同时等待前一个块进行处理。

从选择器中注销键并在处理块时重新注册。

将密钥设置为不感知可读并在处理块时重置。

我认为这就是你想要的,切换阅读兴趣

selectionKey.interestOps(selectionKey.interestOps() ^ SelectionKey.OP_READ);
于 2012-12-11T03:16:36.773 回答
1

只需取消它并稍后重新注册频道,或者OP_READ,通过更改它来取消注册它interestOps(),并在您准备好再次读取它时将它们改回来。

于 2012-12-11T07:39:51.847 回答