2017-11-18 3 views
0

Im mit Akka 2.5.6 in Java 8 und ich möchte den richtigen Weg zu Ende ActorSystem wissen, Teil der Funktionalität meines Codes ist es, einige XML-Dateien zu verarbeiten und zu validieren, zu erreichen Ich habe 3 Schauspieler erstellt: Controller, Prozessor und Validator. Der Controller ist dafür verantwortlich, den Prozess einzuleiten und Datei für Datei und andere Informationen an den Prozessor zu senden, dann erstellt der Prozessor eine digitale Signatur der Datei und sendet die Antwort an den Validator, der schließlich den Status validiert und eine OK - Nachricht an den Controller, der die Anzahl der validierten Dateien zählt und sie mit den gesamten Dateien vergleicht. Sobald die Gesamtzahl der Dateien mit den insgesamt validierten Dateien gleich ist, rufe ich auf, um das ActorSystem mit der Methode terminate() zu beenden.Akka ActorSystem nie in Java beenden

Das Verfahren ist bis zum Ende wie folgt:

 private void endActors() 
     {   
    ActorSystem actorSystem = getContext().system(); 
    Future <Terminated> terminated = actorSystem.terminate(); 
     do { 
      log.info ("Waiting to finish ..."); 
      try { 
      Thread.sleep (30000L); 
      } catch (InterruptedException ex) { 
      log.error ("Error in Thread."); 
      } 
     } while (! ended.isCompleted()); 
      log.info ("Actors finished processing."); 
     } 

Die Schleife endet nie, weil die Zukunft nie abgeschlossen ist, ich weiß nicht, ob dies der richtige Weg ist, ich hoffe, Sie haben mich verstanden und kann mir helfen oder gib mir einen Rat.

Antwort

0

Um einen Akteur System mit einer maximalen Wartezeit herunterzufahren, verwenden Sie die folgenden Schritte aus:

import scala.concurrent.Await; 
import scala.concurrent.duration.Duration; 

Await.ready(actorSystem.terminate(), Duration.create(30, TimeUnit.SECONDS)); 

Auch Ihre do-while-Schleife lässt vermuten, dass Sie etwas darauf warten zu beenden, während das System in der ist Prozess der Beendigung. Sie sollten sicherstellen, dass Ihr System bereit ist, heruntergefahren zu werden vor Aufruf actorSystem.terminate(). Dies könnte so einfach sein wie die in Ihrem Controller Schauspieler folgend:

if (numFiles == numFilesValidated) { 
    log.info("All the files have been processed. Shutting down the system."); 
    Await.ready(getContext().system().terminate(), Duration.create(30, TimeUnit.SECONDS)); 
} 
+0

Ich habe versucht, das zu tun, aber es funktioniert nicht, am Ende bekomme ich eine Ausnahme vom Typ InterruptedException oder Timeout, weil es das Timeout überschreitet, ich verstehe nicht, Was ist das Problem. Ich habe auch die Versionen von akka und Abhängigkeiten geändert, jetzt benutze ich diese Bibliotheken: akka-actor_2.12-2.4.17, config-1.3.0 und scala-library-2.12.1. –

Verwandte Themen