2012-03-12 13 views
7

He estado utilizando la biblioteca de envío de Databinder en un cliente para una API REST-ish simple. Yo sé cómo detectar si recibo una respuesta HTTP con un estado de error:Biblioteca Scala Dispatch: cómo manejar la falla de conexión o el tiempo de espera?

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

Pero, ¿cómo puedo distinguir una respuesta errónea de un fracaso para obtener ninguna respuesta en absoluto, debido a un dominio o el fracaso no válido para conectar ? ¿Y hay alguna forma de implementar un tiempo de espera mientras se sigue utilizando la semántica sincrónica? Si hay algo relevante en la API, me lo perdí.

Respuesta

4

El Periodic Table nos dice que >! establece un detector de excepciones y un hilo de la lista de correo reciente explica how to set a timeout.

Todos juntos, entonces, es posible hacer algo como:

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

Tenga en cuenta que no he probado esto ...

+0

Gracias ... pero yo no creo que el ExceptionListener hace lo que yo quiero . Quiero hacer que la solicitud HTTP devuelva algún valor X si obtuvo la excepción E. Parece que ExceptionListener no devuelve nada, se define como Catcher [Unidad]. Simplemente se llama y luego Http vuelve a lanzar la excepción. Entonces, creo que tengo que hacer una prueba/captura después de todo, que es lo que quería evitar. –

3

En caso de que utilice el reinicio de Despacho (con AsyncHttpClient como el subyacente biblioteca) así es como lo haces con la configuración del cliente:

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()) 
} 

y luego sólo tiene que utilizar este nuevo objeto como era de otra manera utilizar http:

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

El tamaño máximo de la agrupación de conexiones también debe definirse aquí y cómo definir el tamaño de la cola dinámica y el tamaño máximo de la cola. – akshaymani

15

También hay una forma más elegante de configurar el cliente utilizando Http.configure método que recibe Builder => Builder función como argumento:

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

Uno podría querer usar setRequestTimeoutInMs además de setConnectionTimeoutInMs, ya que se complementan entre sí. – h7r

Cuestiones relacionadas