2017-11-18 255 views
0

在Java 8中使用Akka 2.5.6我想知道正确的方式来完成ActorSystem,我的代码的一部分功能是处理一些XML文件并验证它们,以实现我已经创建了3个角色: 控制器,处理器和验证器。 控制器负责启动进程并通过文件和其他信息向处理器发送文件,然后处理器创建该文件的数字签名并将响应发送给验证器,最终验证状态并向其发送一条OK消息控制器对正在验证的文件数进行计数,并将其与总文件进行比较。一旦文件总数与经过验证的文件总数相等,我就调用以terminate()方法完成ActorSystem。Akka ActorSystem永远不会以Java终止

完成的方法如下:

 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."); 
     } 

的循环永远不会结束,因为未来是永远不会完成,我不知道这是正确的方式,我希望你能理解我,能不能帮我或给我一些建议。

回答

0

要关闭一个演员系统最大的等待时间,使用以下命令:

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

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

此外,您do-while循环建议你等待的东西来完成,而该系统是在终止过程。你应该确保你的系统准备好在之前关闭actorSystem.terminate()

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

我想这样做,但它不工作,我到底得到类型InterruptedException的或TimeoutException异常的一个例外,因为它超过了超时,我不明白:这可能是简单的在你的控制器演员以下问题是什么。我也改变了akka和依赖关系的版本,现在我使用这些库:akka-actor_2.12-2.4.17,config-1.3.0和scala-library-2.12.1。 –