2014-02-12 14 views
5

wo das Gespräch zu dispatch.Http.shutdown() setzen, wenn es n unabhängige Http nennt wie zum Beispiel: Wo setzen 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() // <<<<< ????? 
} 

Danke,/nm

bearbeiten: Könnte das eine Option sein, sagen wir, ist das ein "richtiger" Weg, es zu tun?

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

Der Code in Ihrer Bearbeitung ist der Weg zu gehen! Solche Futures wiederzuverwenden ist ziemlich elegant. –

+0

Danke @KevinWright! –

+0

@KevinWright: Sie könnten auch eine Antwort für http://stackoverflow.com/questions/21791580/where-to-put-dispatch-http-shutdown-in-case-of-cascading-http-calls haben. Danke,/nm –

Antwort

3

AFAIK Sie tun es nur am Ende der Anwendung (oder, genau genommen, wenn Sie mit einem bestimmten Thread getan werden), denn sobald es fertig ist, werden alle bestehenden Verbindungen verschwunden sind und Sie können nicht erstellen irgendwelche neuen.