ActorでDispatchを使うときHttp.configureは使えなかった
Actorでdispatchを使ってRSSを解析しようとしたら。
dispatchの通常の使い方ではエラーとなったので、残しておく。
dispatchを使う時、dispatch.Http
を作成して利用するのですが。
Actor内では、Http.configure
を使って dispatch.Http
を作ろうとすると上手くいきませんでした。
val executorService = Executors.newFixedThreadPool(10) val httpClient = Http.configure { _.setExecutorService(executorService) .setIOThreadMultiplier(1) .setAllowPoolingConnection(true) .setAllowSslConnectionPool(true) .setConnectionTimeoutInMs(3000) .setRequestTimeoutInMs(10000) .setFollowRedirects(true) .setMaximumConnectionsPerHost(30) }
Http.configure
頼らず、Javaの書き方で対応する。
val executorService = Executors.newFixedThreadPool(10) val asyncHttpClient = new AsyncHttpClient( new AsyncHttpClientConfig.Builder() .setExecutorService(executorService) .setIOThreadMultiplier(1) .setAllowPoolingConnections(true) .setAllowPoolingSslConnections(true) .setConnectTimeout(3000) .setRequestTimeout(10000) .setCompressionEnforced(true) .setFollowRedirect(true).build) val httpClient = new Http(asyncHttpClient)
httpClientが作成できれば、こっちのものなのでいつも通りのdispatchを使い方でおk
val req: dispatch.Req = dispatch.url(url) val r = httpClient(req > (x => x)) val res = r()
Actorのコード全体
class RssActor extends Actor with ActorLogging { private val executorService = Executors.newFixedThreadPool(10) private val asyncHttpClient = new AsyncHttpClient( new AsyncHttpClientConfig.Builder() .setExecutorService(executorService) .setIOThreadMultiplier(1) .setAllowPoolingConnections(true) .setAllowPoolingSslConnections(true) .setConnectTimeout(3000) .setRequestTimeout(10000) .setCompressionEnforced(true) .setFollowRedirect(true).build) private val httpClient = new Http(asyncHttpClient) // private val httpClient = Http.configure { // _.setExecutorService(executorService) // .setIOThreadMultiplier(1) // .setAllowPoolingConnection(true) // .setAllowSslConnectionPool(true) // .setConnectionTimeoutInMs(3000) // .setRequestTimeoutInMs(10000) // .setFollowRedirects(true) // .setMaximumConnectionsPerHost(30) // } def receive = { case msg: String => log.info("start actor") .... } override def postStop() = { log.info("stopped actor") } }