如何在X时间后杀死一名Akka演员?

时间:2014-10-07 14:49:03

标签: java akka

是否有一种机制可以用来在玩家创建20秒后杀死它?

http://doc.akka.io/docs/akka/snapshot/java/fault-tolerance.html

阅读各种SuperVisor策略

似乎杀死一个演员都是基于异常的消息传递?

4 个答案:

答案 0 :(得分:6)

您可以使用Scheduler在20秒后向演员发送PoisonPill消息,这会在演员处理该消息时自动终止演员;演员中不需要额外的代码。如果你想立即杀死演员,而不是等待毒丸在消息队列中运行,那么请改用stop

system.scheduler().scheduleOnce(Duration.create(20, TimeUnit.SECONDS),
    new Runnable() {
        @Override
        public void run() {
            testActor.tell(PoisonPill.getInstance(), ActorRef.noSender());
        }
    }, system.dispatcher());

答案 1 :(得分:3)

与Chris K的答案类似,但采用略有不同的方法,您可以让演员安排在执行preStart挂钩后20秒内将PoisonPill消息发送给自己,例如

@Override
public void preStart() {
    getContext().system().scheduler().scheduleOnce(
            Duration.create(20, TimeUnit.SECONDS),
            getSelf(),
            PoisonPill.getInstance(),
            getContext().dispatcher(),
            ActorRef.noSender());
}

如果需要,这会将行为保留在UntypedActor的定义范围内。

答案 2 :(得分:0)

akka库中似乎有一个功能可以解决这个问题。没有使用它本身,但声音的承诺:在[T]

之后

Documentation about it here

如果未来成功完成,演员可以向itselfe发送毒丸。

self ! PoisonPill

答案 3 :(得分:0)

有以下方法:

  1. 使用上述答案中所述的调度程序发送毒丸

  2. 使用调度程序发送“STOP”

    @Override
    public void preStart() {
        getContext().system().scheduler().scheduleOnce(
            Duration.create(20, TimeUnit.SECONDS),
                getSelf(),
                "STOP",
                getContext().dispatcher(),
                ActorRef.noSender());
    }
    

对于停止消息,只需执行以下操作:

   if (message.toString().equals("STOP")) {
        getContext().stop(getSelf());
   } 

以下 StackOverflow 线程中给出了上述方法之间的区别: Akka Kill vs. Stop vs. Poison Pill?

注意:你不能在演员正在做的过程中阻止它。