首页 文章

在“Dispatch”库中等待超时响应

提问于
浏览
2

我将使用Dispatch编写一个简单的HTTP客户端 . 我打电话给 dispatch.Http 以获得未来并致电未来以获得回应

val request = ...
val future = Http(request) // call the server asynchronously
val response = future() // wait for the response from the server

现在我想知道如何等待超时 . 我想最后一次API调用是:

// throw an exception if no response received within timeout
val response = future(timeout: Long)

是否有意义 ?

我明白 Dispatch 返回 scala.concurrent.Future ,它不提供带超时的API . 你会如何建议我实施它?

2 回答

  • 3

    首先,您可以使用Await

    import scala.concurrent.Await
    import scala.concurrent.duration._
    
    Await.result(future, 10 seconds) //you can specify timeout here
    

    问题是,如果未来无法在指定的超时时间内返回,它将抛出异常 .

    如果您需要更多灵活性,那么第二种方法是:

    val futureTimeout = Promise.timeout("Timed out" /* or throw new RuntimeException("timed out") */, 10 seconds)
    Future.firstCompletedOf(Seq(futureResult, futureTimeout)).map {
      case result: SomeType => //do something
      case timedOut: SomeOtherType => //handle timeout
    }
    
  • 5

    您可以创建配置的Http客户端:

    val httpApplicationClient = Http.configure(_. setRequestTimeoutInMs(3000))

    val future = httpApplicationClient(request)

    ...

相关问题