0

在 API 有:

val http = Http.configure(_
    .setConnectionTimeoutInMs(1)
  )

这个配置有什么用?我将它用于:

.setMaxRequestRetry(0)

我打了我会在超时后失败的未来。我这样创造的未来:

val f = http(u OK as.String)
  f.map {
    NotificationClientConnectionParams.parseFromString
  }

但是我没有失败,而是在超时后很久才获得成功。它应该如何工作?

我的测试如下所示:

val startTime = java.time.LocalTime.now()
val f = TcpUtil2.registerClientViaDispatch(ClientHeaders("12345", "123456789"))
f onSuccess {
  case c =>
    println(s"Success: $c")
    println(java.time.Duration.between(startTime, java.time.LocalTime.now()).toMillis)
}
f onFailure {
  case e =>
    println(s"failure:${e.getMessage}")
}
Thread.sleep(2000)

响应时间为数百毫秒,我成功了。这是调度的错误吗?

4

1 回答 1

1

HTTP 往返经历了几个阶段(过于简化):

  1. 建立连接
  2. 连接已建立
  3. 发送请求载荷
  4. 发送的请求有效载荷
  5. 等待响应有效载荷
  6. 接收响应负载
  7. 收到响应载荷

据我了解,您测量状态 1 和 7 之间的时间。

setConnectionTimeoutInMs来自Dispatch内部使用的async-http-client 。这是其文档的摘录:

AsyncHttpClient设置连接到远程主机时可以等待的最长时间(以毫秒为单位)

因此,此方法设置客户端在状态 1 和 2 之间等待的最长时间。

还有setRequestTimeoutInMs

设置 AsyncHttpClient 等待响应的最长时间(以毫秒为单位)

这种方法似乎设置了状态 5 和 6(或 7,我不确定是哪一个)之间的时间。


所以这就是你的情况可能发生的事情。您连接到远程主机,服务器很快接受连接(1 和 2 之间的时间很小),所以您Future不会失败。然后有几种选择:要么服务器在开始将响应发送回您之前需要花费大量时间来准备响应(5 到 6 之间的时间),要么响应非常大,因此需要花费大量时间来传递它给你(6点到7点之间的时间),或两者兼而有之。但是由于您没有设置请求超时,因此您Future不会因此而失败。

于 2015-09-30T14:37:52.403 回答