首页 文章

超时如何在Dispatch中工作

提问于
浏览
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)

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

1 回答

  • 1

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

    • Build 连接
      Build 了

    • 连接

    • 发送请求有效负载

    • 请求有效载荷已发送

    • 等待响应有效负载

    • 接收响应有效负载
      收到

    • 响应有效载荷

    根据我的理解,你可以衡量1到7号州之间的时间 .

    setConnectionTimeoutInMs 来自async-http-client,内部由Dispatch使用 . 以下是its documentation的摘录:

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

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

    还有setRequestTimeoutInMs

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

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


    所以这里可能会发生's what' . 你连接到远程主机,服务器很快接受连接(1到2之间的时间很小),所以你的 Future 没有设置请求超时,因此你的 Future 没有失败 .

相关问题