gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:55:21 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com