java - Akka ActorSystem 在 Java 中永远不会终止

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

我在 Java 8 中使用 Akka 2.5.6,我想知道完成 ActorSystem 的正确方法,我的代码的部分功能是处理一些 XML 文件并验证它们,为了实现这一点,我创建了 3 个 actor: Controller 、处理器和 validator 。 Controller 负责启动进程并向处理器发送文件和其他信息,然后处理器创建文件的数字签名并将响应发送到 validator , validator 最终验证状态并向 Controller 发送 OK 消息, Controller 计算已验证的文件数量并将其与文件总数进行比较。一旦文件总数与已验证文件总数相等,我就调用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.");
       }

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

最佳答案

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

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;
}

关于java - Akka ActorSystem 在 Java 中永远不会终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47362411/

相关文章:

scala - Akka Actor-等待一段时间,等待消息,否则发送消息

java - BufferedReader 即使在按回车后也没有接受输入

java - 这个java正则表达式有什么问题?

Java 方法引用解析

Java OffsetDateTime isAfter 和 isBefore 处理时区?

java - Akka:意外的邮箱填满

akka - 如何更改普罗米修斯抓取指标的端口号

java - TreeSet 比较器执行不一致

java - `Caused by: java.lang.RuntimeException: view must have a tag` 的实际含义是什么?

Diamond 运算符中的 Java 传递类变量