Akka ActorSystem永远不会在Java中终止

时间:2017-11-18 04:11:20

标签: java java-8 akka digital-signature akka-actor

我在Java 8中使用Akka 2.5.6并且我想知道完成de ActorSystem的正确方法,我的代码的一部分功能是处理一些XML文件并验证它们,实现这个我创建了3个actor : 控制器,处理器和验证器。 Controller负责启动进程并将文件和其他信息发送到处理器,然后处理器创建文件的数字签名,并将响应发送到最终验证状态的Validator,并向Controller发送OK消息它计算验证的文件数,并将它们与总文件进行比较。一旦包含有效验证文件总数的文件总数相等,我就调用使用terminate()方法完成ActorSystem。

完成的方法如下:

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

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

1 个答案:

答案 0 :(得分:0)

尝试以下操作(这里的键是完整的)。我按照这些思路编写了一个类,用于对junit进行设置和拆卸,以避免参与者系统在另一个测试中创建之前未完全终止一个测试的拆卸中的问题。 (这导致端口已在使用中)

private static ActorSystem system = null;    
private static Future<Terminated> terminatedFuture;

public static ActorSystem getFreshActorSystem() {
    tearDownActorSystem();
    while(system != null) {
        try {
            Thread.sleep(500L);
        } catch (InterruptedException e) {

        }
    }
    system  = ActorSystem.create();
    return system;
}

public static void tearDownActorSystem() {
    if (system !=null && !isInMiddleOfTerminating()) {
        terminatedFuture = system.terminate();

        terminatedFuture.onComplete( new OnComplete(){
            @Override
            public void onComplete(Throwable failure, Object success) throws Throwable {
                system = null;
                terminatedFuture = null;
            }
        } , system.dispatcher());
    }
}

private static boolean isInMiddleOfTerminating() {
    return terminatedFuture !=null;
}