我正在使用适用于 Akka 2.0 的 Java API,并且有一种下沉的感觉,即我没有正确使用 ActorSystem 来启动和/或/xor 停止 TypedActors。当应用程序关闭时,java 进程不会终止。经过调试,我看到默认调度程序仍然有多个正在运行的线程,并且调度程序仍在运行。在下面的示例中,有什么明显的我做错了吗?
Config akkaConf = ConfigFactory.load();
ActorSystem actorSystem = ActorSystem.create("myApp", akkaConf);
TypedProps<Actor1Impl> actor1TypedProps = new TypedProps<Actor1Impl>(Actor1Interface.class, new Creator<Actor1Impl>(
public Actor1Impl create() {
return new Actor1Impl(nonDefault, constructor, scalaIsSo, muchMoreElegant);
}
);
Actor1Interface a1 = TypedActor.get(actorSystem).typedActorOf(actor1TypedProps, "anA1Actor");
读者不知道(为了简洁起见),Actor1Impl 类实现了 TypedActor.PreStart 和 .PostStop。在 PreStart 中,它会安排一个 Runnable 任务定期执行。我认为这可以保持调度程序处于活动状态,但我还保存了返回的 Cancellable,我相信我应该在 PostStop 块中取消它。这无助于终止调度程序线程。无论如何,回到故事...
还有许多其他的actor类型,每一个都有一个非标准的构造函数。其中一些向调度程序注册定期 Runnable,就像上面的 Actor1Impl 一样。为了更有趣,有些甚至需要其他 Actor 作为构造函数参数,以便让 Actor 注册回调,如下所示:
public Actor2Impl(Actor1Interface a1) {
a1.registerCallback(TypedActor.<Actor2Interface>self());
}
在确定应用程序已过期后,将执行以下操作:
TypedActor.get(actorSystem).stop(a1);
TypedActor.get(actorSystem).stop(a2);
...
TypedActor.get(actorSystem).stop(aN);
actorSystem.shutdown();
有什么我正在做的明显错误的事情会阻止java进程终止吗?具体来说,有什么会导致调度程序和默认调度程序关闭?