在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)
响应时间是几百毫秒,我获得了成功。这是派遣的错误吗?
答案 0 :(得分:1)
HTTP往返经历了几个阶段(过度简化):
根据我的理解,你衡量的是1号和7号州之间的时间。
setConnectionTimeoutInMs
来自async-http-client,内部由Dispatch使用。以下摘自its documentation:
设置连接到远程主机时
AsyncHttpClient
可以等待的最长时间(以毫秒为单位)
因此,此方法设置客户端在状态1和2之间等待的最长时间。
设置AsyncHttpClient等待响应的最长时间(以毫秒为单位)
这种方法似乎设置了状态5和6之间的时间(或7,我不确定哪一个)。
所以这就是你的情况可能发生的事情。您连接到远程主机,服务器非常快速地接受连接(1到2之间的时间很短),因此您的Future
不会失败。然后有几个选项:服务器需要花费大量时间准备响应才能开始将响应发送给您(5到6之间的时间),或者响应非常大,因此需要花费大量时间来提供响应给你(6到7之间的时间),或两者兼而有之。但是,由于您未设置请求超时,因此Future
未因此而失败。