【问题标题】:Scala Dispatch library: how to handle connection failure or timeout?Scala Dispatch 库:如何处理连接失败或超时?
【发布时间】:2012-03-29 09:37:19
【问题描述】:

我一直在客户端中使用 Databinder Dispatch 库来实现简单的 REST 式 API。我知道如何检测我是否收到带有错误状态的 HTTP 响应:

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

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

【问题讨论】:

    标签: scala databinder scala-dispatch


    【解决方案1】:

    还有一种更优雅的方式来配置客户端,使用Http.configure 方法接收Builder => Builder 函数作为参数:

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

    【讨论】:

    • 除了 setConnectionTimeoutInMs 之外,可能还想使用 setRequestTimeoutInMs,因为它们可以很好地互补。
    【解决方案2】:

    Periodic Table 告诉我们>! 设置了一个异常侦听器,最近的邮件列表线程解释了how to set a timeout

    那么,你可能会做这样的事情:

    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,这是我想要避免的。
    【解决方案3】:

    如果您使用 Dispatch 重新启动(使用 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
    

    【讨论】:

    • 这里也需要定义最大连接池大小,如何定义动态队列大小和最大队列大小?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2022-12-10
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多