【问题标题】:Retrieving http response using spray and futures with timeout使用带有超时的喷雾和期货检索http响应
【发布时间】:2016-05-18 22:51:53
【问题描述】:

我正在尝试找出使用超时从 GET http 请求中检索内容的最佳方法。我花了很多时间试图找出最好的方法,但我有点不确定。

基本上我只想有一个选项,如果在超时之前没有响应,则返回 None,否则返回内容。

谢谢

【问题讨论】:

  • 你用的是喷http客户端吗?
  • 是的,我正在使用 Spray

标签: 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))
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      相关资源
      最近更新 更多