超时如何在Dispatch中工作

时间:2015-09-30 12:48:32

标签: scala timeout scala-dispatch

在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)

响应时间是几百毫秒,我获得了成功。这是派遣的错误吗?

1 个答案:

答案 0 :(得分:1)

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

  1. 建立连接
  2. 建立连接
  3. 发送请求有效负载
  4. 请求有效负载已发送
  5. 等待响应有效负载
  6. 接收响应有效负载
  7. 收到的响应有效负载
  8. 根据我的理解,你衡量的是1号和7号州之间的时间。

    setConnectionTimeoutInMs来自async-http-client,内部由Dispatch使用。以下摘自its documentation

      

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

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

    还有setRequestTimeoutInMs

      

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

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

    所以这就是你的情况可能发生的事情。您连接到远程主机,服务器非常快速地接受连接(1到2之间的时间很短),因此您的Future不会失败。然后有几个选项:服务器需要花费大量时间准备响应才能开始将响应发送给您(5到6之间的时间),或者响应非常大,因此需要花费大量时间来提供响应给你(6到7之间的时间),或两者兼而有之。但是,由于您未设置请求超时,因此Future未因此而失败。