Библиотека Scala Dispatch: как обработать сбой соединения или тайм-аут?

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

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

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

3 ответа

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

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

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

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

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

Обратите внимание, что я не проверял это...

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