2012-03-12 9 views
7

Ho utilizzato la libreria Databinder Dispatch in un client per una semplice API REST-ish. So come rilevare se ottengo una risposta HTTP con uno stato di errore:Libreria di distribuzione Scala: come gestire l'errore di connessione o il timeout?

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

Ma come posso distinguere una risposta di errore da un fallimento di ottenere qualsiasi risposta a tutti, a causa di un dominio o il fallimento non valida per la connessione ? E c'è un modo per implementare un timeout mentre si utilizza ancora la semantica sincrona? Se c'è qualcosa di rilevante nell'API, l'ho perso.

risposta

4

Periodic Table ci dice che >! imposta un listener di eccezioni e un thread di mailing list recente spiega how to set a timeout.

Tutti insieme, allora, si potrebbe fare qualcosa di simile:

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

Si noti che non ho ancora testato questo ...

+0

Grazie ... ma non credo che l'ExceptionListener fa quello che voglio . Voglio fare in modo che la richiesta HTTP restituisca qualche valore X se ha ottenuto l'eccezione E. Sembra che ExceptionListener non restituisca nulla: è definito come Catcher [Unità]. Viene appena chiamato e quindi Http ripaga l'eccezione. Quindi penso che ho bisogno di fare un tentativo/cattura dopo tutto, che è quello che volevo evitare. –

3

Nel caso in cui si utilizza spedizione riavvio (con AsyncHttpClient come sottostante biblioteca) questo è come quando si imposta la configurazione del client:

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

e poi basta usare questo nuovo oggetto, come si sarebbe altrimenti usare http:

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

La dimensione massima del pool di connessione deve essere definita qui e come definire la dimensione dinamica della coda e la dimensione massima della coda? – akshaymani

15

V'è anche un modo più elegante per configurare client utilizzando Http.configure metodo che riceve Builder => Builder funzione come argomento:

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

Si potrebbe desiderare di utilizzare setRequestTimeoutInMs oltre a setConnectionTimeoutInMs, poiché si completano a vicenda. – h7r

Problemi correlati