2017-11-18 291 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。 –