2016-04-19 1 views
0

Im très nouveau à l'akka et à terme dans la scala. Im utilisant spray pour obtenir la sortie d'une URL et retourner un Future[String] à un autre objet. Voici l'objet qui effectue la requête HTTP.Arrêtez le système akka avec le spray du système non akka

object ActionsService { 

    private implicit val formats = DefaultFormats 
    implicit val system = ActorSystem() 
    import system.dispatcher 

    val pipeline = sendReceive ~> unmarshal[String] 
    def getActions: Future[String] ={ 
    val out = getOutput("http://www.google.com") 
    out 
    } 


    def getOutput(url: String): Future[String] ={ 
    val response = pipeline (Get (url)) 
    response 
    } 

    def shutdown(code: Int): Unit = { 
    IO(Http).ask(Http.CloseAll)(1.second).await 
    system.shutdown() 
    } 
} 

Et voici la principale méthode dans l'autre objet où je suis en train d'arrêter le système d'acteur.

import ExecutionContext.Implicits.global 
def main(args: Array[String]) { 
    val test = ActionsService.getActions 
test.onComplete { 
    case Success(x) => println(x) 
    case Failure(y) => println(y) 
} 
    ActionsService.system.shutdown() 

Pour une raison quelconque, le système Akka ne s'arrêtera pas. J'ai également essayé d'arrêter le système akka en utilisant ma méthode d'arrêt mais j'ai une erreur Exception in thread "main" akka.pattern.AskTimeoutException: Timed out (qui se produit également dans la méthode principale quand la méthode d'arrêt est appelée).

version 2.2.3 AKKA

Répondre

0

la réponse ci-dessus ne finissent par travailler pour moi, donc je devais bloquer le fil en ajoutant une période de sommeil pour la principale méthode avant que la méthode d'arrêt est appelé.

def main(args: Array[String]) { 
    val test = ActionsService.getActions 
    Thread.sleep(700) 
test.onComplete { 
    case Success(x) => println(x) 
    case Failure(y) => println(y) 
} 
CorporateActionsService.system.shutdown() 

} 
0

Vous n'avez pas spécifié version de Akka que vous utilisez, mais en dernière version vous devez appeler

system.terminate() 

au lieu et attendre la fin comme celui-ci (ass un exemple)

Await.ready(system.whenTerminated, Duration.Inf) 
+0

version AKKA 2.2.3 et j'ai essayé ActionsService.system.awaitTermination() qui se termine apparemment jamais .. – Zee

+0

ces méthodes existent dans DonT 2.2.3 – Zee