2013-07-26 4 views
0

Je suis sur Scala 2.10.2 et que vous souhaitez mettre en œuvre un fournisseur de http threadsafe utilisant Apache http client 4.2.5, voici ce que je l'ai faitApache http client threadsafe

import net.liftweb.json._ 
import net.liftweb.json.JsonDSL._ 
import scala.concurrent.Future 

object AsyncHttpProvider { 
    import org.apache.http.client._ 
    import org.apache.http.client.methods._ 
    import org.apache.http.impl.client._ 

    val httpclient = new DefaultHttpClient 

    private def get(query: String) = { 
    val httpget = new HttpGet(query) 
    val brh = new BasicResponseHandler 
    httpclient.execute(httpget, brh) 
    } 

    def getResponseBodyAsJValue(query: String): Future[JValue] = Future(parse(get(query))) 
    def getResponseBodyAsJsonString(query: String): Future[String] = Future(get(query)) 
} 

Depuis que je suis en utilisant Future , Je veux m'assurer que le code est thread-safe, n'est-ce pas?

Répondre

1

Il est documenté que le DefaultHttpClient est threadsafe (http://hc.apache.org/httpcomponents-client-ga/tutorial/html/httpagent.html), mais vous n'avez pas besoin de le recréer dans votre fonction "get". Habituellement, la création du client est assez coûteuse et il peut être plus efficace d'instancier une ou plusieurs instances regroupées à partager entre les threads. Dans ce cas, vous pouvez créer ou injecter l'instance dans votre objet et la référencer dans le futur. La seule nouvelle chose à créer serait le gestionnaire de méthode et de réponse.

En parlant des appels asynchrones, vous pouvez également envisager la recherche athttp: //hc.apache.org/httpcomponents-asyncclient-dev/examples.html

+1

Bon point sur ne pas avoir besoin de recréer la 'DefaultHttpClient' intérieur 'get', j'ai reflété le changement dans ma question. Donc, il semble que ce soit thread-safe maintenant. – Bob

+0

Comme il s'avère que ce n'est pas ce que je pensais, avec chaque connexion client, je dois consommer le corps de la réponse avant de pouvoir réutiliser la connexion pour une autre requête, donc mon code d'origine jusqu'à ce que j'applique de la mise en commun. – Bob

Questions connexes