【问题标题】:Retrieving http response using spray and futures with timeout使用带有超时的喷雾和期货检索http响应
【发布时间】:2016-05-18 22:51:53
【问题描述】:
我正在尝试找出使用超时从 GET http 请求中检索内容的最佳方法。我花了很多时间试图找出最好的方法,但我有点不确定。
基本上我只想有一个选项,如果在超时之前没有响应,则返回 None,否则返回内容。
谢谢
【问题讨论】:
标签:
scala
http
httprequest
spray
【解决方案1】:
所以我想你正在尝试解决 2 个问题。如何在配置中定义特定的超时,以及如何在超时发生时对其进行管理。
-
定义 http 客户端超时:您需要更新您的 application.conf 以覆盖 default configuration of the http client。例如:
spray.can {
client {
request-timeout = 20s
}
}
-
管理超时:当您使用spray client 时,您将使用将运行请求的pipeline。这将是一个类似于(HttpRequest) => Future[ObjectResponse] 的函数。
结果将是您定义的对象的Future,在我的示例中为ObjectResponse,您可以解析未来。如果出现超时,Future 将变为RequestTimeoutException。然后您将能够使用recover 处理超时异常。所以你的代码看起来像这样:
def sendRequestFunction(...): Future[ObjectResponse] = {...}
sendRequestFunction(parameters) map (Option) // In case we get an object, we will have a Some(obj)
recover {
case e: RequestTimeoutException => None
}
【解决方案2】:
你可以试试这样的:
timedOutFuture = after(duration = duration, using = system.scheduler) {
Future.successfull(None)
}
Future.firstCompletedOf(Seq(youHttpRequestFuture, timedOutFuture))
希望对你有帮助