2014-02-12 65 views
5

哪裏調用dispatch.Http.shutdown()是否有n獨立的HTTP調用等等,例如放置: 放在哪裏dispatch.Http.shutdown()

import com.typesafe.scalalogging.slf4j.Logging 
import org.json4s._ 
import org.json4s.native.JsonMethods._ 
import scala.util.{ Failure, Success } 

object Main extends App with Logging { 
    logger.debug("github.cli") 

    // GET /users/defunkt: `curl https://api.github.com/users/defunkt` 
    val host: dispatch.Req = dispatch.host("api.github.com").secure 
    val request: dispatch.Req = host/"users"/"defunkt" 
    logger.debug(s"Request URL: ${request.url}") 

    import dispatch.Defaults.executor 

    dispatch.Http(request > dispatch.as.Response(_.getHeaders())) onComplete { 
    case Success(h) => logger.debug(h.toString()) 
    case Failure(e) => logger.debug(s"Error: $e") 
    } 
    dispatch.Http(request OK dispatch.as.json4s.Json) onComplete { 
    case Success(j) => logger.debug(j.toString()) 
    case Failure(e) => logger.debug(s"Error: $e") 
    } 

    //dispatch.Http.shutdown() // <<<<< ????? 
} 

謝謝,/納米

編輯:這可能是一個選擇,比方說,這是一個「正確」的方式來做到這一點?

val headers = dispatch.Http(request > dispatch.as.Response(_.getHeaders())) 
val user = dispatch.Http(request OK dispatch.as.json4s.Json) 
val all  = dispatch.Future.sequence(headers :: user :: Nil) 

headers onComplete { 
    case Success(h) => logger.debug(s"Header: ${h.toString()}") 
    case Failure(e) => logger.debug(s"Error: $e") 
} 
user onComplete { 
    case Success(j) => logger.debug(s"User: ${j.toString()}") 
    case Failure(e) => logger.debug(s"Error: $e") 
} 
all onComplete { case _ => dispatch.Http.shutdown() } 
+1

編輯中的代碼是要走的路!像這樣重新使用這種期貨相當優雅。 –

+0

謝謝@KevinWright! –

+0

@KevinWright:您可能也有一個答案http://stackoverflow.com/questions/21791580/where-to-put-dispatch-http-shutdown-in-case-of-cascading-http-calls。謝謝,/ nm –

回答

3

據我所知,你只能做它在應用程序(或嚴格地說,當你與一個特定的線程中完成的),因爲一旦完成,所有現有的連接都沒有了年底,你不能創建任何新的。