使用AKKA Java API启动ActorSystem的正确方法

时间:2012-04-10 05:32:25

标签: java akka typedactor

我正在使用Java API for Akka 2.0,并且有一种下沉的感觉,我没有正确使用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块中取消。哪个没有帮助终止Scheduler线程。无论如何,回到故事......

还有许多其他actor类型,每个类型都有一个nonStandard构造函数。其中一些使用调度程序注册周期性Runnables,上面的Actor1Impl也是如此。为了增加乐趣,有些人甚至需要其他Actors作为构造函数参数,以便演员注册回调,如下所示:

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进程终止吗?具体来说,任何会导致调度程序和默认调度程序关闭的东西都会停止?

0 个答案:

没有答案