Библиотека Scala Dispatch: как обработать сбой соединения или тайм-аут? - PullRequest
7 голосов
/ 13 марта 2012

Я использовал библиотеку Databinder Dispatch в клиенте для простого REST-ish API.Я знаю, как определить, получаю ли я ответ HTTP с состоянием ошибки:

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

Но как я могу отличить ответ об ошибке от невозможности получить какой-либо ответ вообще из-за неверного домена или сбоя?подключить?И есть ли способ реализовать тайм-аут при использовании синхронной семантики?Если что-то имеет отношение к API, я пропустил это.

Ответы [ 3 ]

15 голосов
/ 26 марта 2013

Существует также более элегантный способ настройки клиента с использованием метода Http.configure, который получает функцию Builder => Builder в качестве аргумента:

val http = Http.configure(_.setAllowPoolingConnection(true).setConnectionTimeoutInMs(5000))
4 голосов
/ 13 марта 2012

Периодическая таблица сообщает нам, что >! устанавливает прослушиватель исключений, а поток последних рассылок объясняет , как установить время ожидания .

Тогда все вместе, вы можете сделать что-то вроде:

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 голосов
/ 29 августа 2012

В случае, если вы используете 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
...