1

我在 Java 8 中使用 Akka 2.5.6,我想知道完成 de ActorSystem 的正确方法,我的代码的部分功能是处理一些 XML 文件并验证它们,为此我创建了 3 个参与者:控制器,处理器和验证器。Controller负责启动流程,将文件和其他信息逐个发送给Processor,然后Processor创建文件的数字签名并将响应发送给Validator,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.");
       }

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

4

1 回答 1

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;
}
于 2018-09-13T13:32:44.393 回答