首页 文章

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))
    
  • 4

    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 => // ...
    })
    

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

  • 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
    

相关问题