来自 Netty API 文档
connectTimeoutMillis = "the connect timeout in milliseconds. 0 if disabled."
和
ReadTimeoutHandler = Raises a ReadTimeoutException when no data was read within a certain period of time.
从客户的角度来看,我对上述内容的解释是否正确?
The client will attempt to connect to the host for up to "connectTimeoutMillis". If a connection is established, and a ReadTimeoutHandler is NOT added to the Pipeline, a Channel can wait on a response indefinitely. If a ReadTimeoutHandler was added to the Pipeline, a ReadTimeoutException will be raised once timeoutSeconds has elapsed.
一般来说,我只想尝试连接到主机最多 'x' 秒,但如果通过网络发送请求,我想最多等待 'y' 秒回复。如果它塑造/影响答案,则客户端是 Netty,但服务器不是。
跟进:ReadTimeoutHandler 上的 timeoutSeconds 是连续字节读取之间的超时,还是整个请求/响应的超时?示例:如果 timeoutSeconds 为 60,并且每 59 秒读取一个字节(总共 1024 个字节),那么整个响应会在 60416 秒内成功读取,还是会因为总耗用时间超过 60 秒而失败?
最佳答案
ReadTimeoutHandler 不理解响应的概念。它只能理解 Netty 3 中的 messageReceived 事件或 Netty 4 中的 inboundBufferUpdated 事件。从 NIO 的角度来看,此行为的确切影响取决于 ReadTimeoutHandler 在管道中的位置。 (我从未使用过 OIO,所以不能说行为是否完全相同)。
如果 ReadTimeoutHandler 在管道中的任何帧解码器下方(即更靠近网络),那么您描述的行为是正确的 - 单个字节读取将重置计时器,并且正如您所确定的那样,可能会导致响应很长一段时间才能阅读。如果您正在编写服务器,这可能会被利用来形成拒绝服务攻击,而攻击者只需付出很少的努力。
如果 ReadTimeoutHandler 在您的帧解码器之上,那么它适用于您的整个响应。我认为这就是您要寻找的行为。
请注意,ReadTimeoutHandler 也不知道您是否已发送请求 - 它只关心是否已从套接字读取数据。如果您的连接是持久的,并且您只想在发送请求时触发读取超时,则需要构建一个请求/响应感知超时处理程序。
关于java - Netty - connectTimeoutMillis 与 ReadTimeoutHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13390363/