Scala Dispatch 库:如何处理连接失败或超时?

7

我一直在客户端使用Databinder Dispatch库来处理一个简单的REST-ish API。我知道如何检测是否接收到了具有错误状态的HTTP响应:

Http x (request) {
    case (200, _, _, content) => successResult(content())
    case (404, _, _, _) => notFoundErrorResult
    case (_, _, _, _) => genericErrorResult
}

但是,我如何区分错误响应和由于无效域名或连接失败而未能获得任何响应的情况?是否有任何方法可以在仍使用同步语义的同时实现超时?如果API中有任何相关内容,我可能已经错过了。

3个回答

15

还有一种更优雅的方法可以使用Http.configure方法配置客户端,该方法接受一个Builder => Builder函数作为参数:

val http = Http.configure(_.setAllowPoolingConnection(true).setConnectionTimeoutInMs(5000))

除了使用setConnectionTimeoutInMs之外,有人可能还想使用setRequestTimeoutInMs,因为它们互补得很好。 - h7r

4

周期表告诉我们,>!设置了异常监听器。最近一封邮件列表线程解释了如何设置超时

综上所述,您可以执行以下操作:

val http = new dispatch.Http {
  import org.apache.http.params.CoreConnectionPNames
  client.getParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 2000)
  client.getParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000)
}
http(req >! {
  case e => // ...
})

请注意,我还没有测试过这个...

谢谢...但我不认为ExceptionListener做我想要的事情。如果HTTP请求遇到异常E,我想让它返回一些值X。看起来ExceptionListener没有返回任何东西-它被定义为Catcher[Unit]。它只是被调用,然后Http重新抛出异常。所以我认为我还是需要使用try/catch,这正是我想避免的。 - Eli Bishop

3

如果您正在使用Dispatch reboot(基于AsyncHttpClient库)则需要设置客户端配置,具体方法如下:

val myHttp = new dispatch.Http {
  import com.ning.http.client._
  val builder = new AsyncHttpClientConfig.Builder()
  builder.setCompressionEnabled(true)
    .setAllowPoolingConnection(true)
    .setRequestTimeoutInMs(5000)
  override lazy val client = new AsyncHttpClient(builder.build())
}

然后你可以像平时使用 http 一样使用这个新对象:

myHttp((url(baseUrl) <<? args) OK as.xml.Elem).either

最大连接池大小也需要在这里定义,如何定义动态队列大小和最大队列大小? - akshaymani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接