Netty - connectTimeoutMillis与ReadTimeoutHandler

时间:2012-11-15 01:41:23

标签: java netty connection-timeout

来自Netty API文档

  

connectTimeoutMillis =“连接超时(以毫秒为单位。如果禁用,则为0。”

  

ReadTimeoutHandler =在一段时间内没有读取数据时引发ReadTimeoutException。

从客户的角度来看,我是否正确解释上述内容如下?

  

客户端将尝试连接到主机以达到“connectTimeoutMillis”。如果建立了连接,并且未将ReadTimeoutHandler添加到管道,则Channel可以无限期地等待响应。如果将ReadTimeoutHandler添加到Pipeline,则一旦timeoutSeconds过去,将引发ReadTimeoutException。

一般来说,我只想尝试连接主机最多'x'秒,但如果通过线路发送请求,我想等到'y'秒响应。如果它影响/影响答案,客户端是Netty,但服务器不是。

跟进:ReadTimeoutHandler上的timeoutSeconds是连续字节读取之间的超时,还是整个请求/响应的超时?示例:如果timeoutSeconds为60,并且每59秒读取一个字节(总共1024个字节),那么整个响应是否会在60416秒内成功读取,还是因为总耗用时间超过60秒而失败? / p>

2 个答案:

答案 0 :(得分:2)

ReadTimeoutHandler不理解响应的概念。它只能理解Netty 3中的messageReceived事件或Netty 4中的inboundBufferUpdated事件。从NIO的角度来看,这种行为的确切影响取决于ReadTimeoutHandler在管道中的位置。 (我从未使用过OIO,所以不能说行为是否完全相同)。

如果ReadTimeoutHandler低于管道中的任何帧解码器(即更靠近网络),那么您描述的行为是正确的 - 单个字节读取将重置计时器,正如您所确定的那样,可能导致响应很长一段时间被阅读。如果您正在编写服务器,则可能会被利用来代表攻击者以非常小的代价来制造拒绝服务攻击。

如果ReadTimeoutHandler位于帧解码器之上,则它适用于整个响应。我认为这是你正在寻找的行为。

请注意,ReadTimeoutHandler也不知道您是否发送了请求 - 它只关心是否已从套接字读取数据。如果您的连接是持久的,并且您只希望在发送请求时触发读取超时,则需要构建一个请求/响应感知超时处理程序。

答案 1 :(得分:1)

  1. 是的,您已正确识别连接超时和读取超时之间的区别。请注意,无论任何文档可能相反,默认或零连接超时意味着大约60-70秒,而不是无限,并且您只能使用连接超时参数来减少该默认值,而不是增加它。

    < / LI>
  2. 当您调用read()时读取超时开始,并在其到期或数据到达时结束。这是read()可能阻止等待第一个字节到达的最长时间。它不会在单次调用中第二次阻止。