0

私は 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しているので、コードがスレッドセーフであることを確認したいですよね?

4

1 に答える 1

1

DefaultHttpClient はスレッドセーフ ( http://hc.apache.org/httpcomponents-client-ga/tutorial/html/httpagent.html ) であることが文書化されていますが、「get」関数内で再作成する必要はありません。通常、クライアントの作成には非常にコストがかかるため、1 つ以上のプールされたインスタンスをインスタンス化してスレッド間で共有する方が効率的です。この場合、インスタンスを作成またはオブジェクトに挿入し、Future 内で参照できます。作成する唯一の新しいものは、メソッドと応答ハンドラーです。

非同期呼び出しについて言えば、http://hc.apache.org/httpcomponents-asyncclient-dev/examples.html も参照することを検討してください。

于 2013-07-26T23:58:41.097 に答える