我使用的是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
,我想确保代码是线程安全的,是吗?
答案 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