使Apache http客户端线程安全

时间:2013-07-26 23:08:50

标签: scala apache-httpclient-4.x

我使用的是Scala 2.10.2并希望使用Apache http客户端4.2.5实现一个线程安全的http提供程序,这是我所做的

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

由于我使用Future,我想确保代码是线程安全的,是吗?

1 个答案:

答案 0 :(得分:1)

据记载,DefaultHttpClient是线程安全的(http://hc.apache.org/httpcomponents-client-ga/tutorial/html/httpagent.html),但您无需在“get”函数中重新创建它。通常,客户端创建非常昂贵,并且可以更有效地实例化跨线程共享的一个或多个池化实例。在这种情况下,您可以在对象中创建或注入实例,并在Future中引用它。创建的唯一新事物是Method和响应处理程序。

说到异步调用,您也可以考虑查看:http://hc.apache.org/httpcomponents-asyncclient-dev/examples.html