Akka ActorSystem从未在Java中终止



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

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

尝试以下操作(这里的关键是完成时)。我按照这些思路编写了一个类,用于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;
}

最新更新