是否有一种机制可以用来在玩家创建20秒后杀死它?
在http://doc.akka.io/docs/akka/snapshot/java/fault-tolerance.html
阅读各种SuperVisor策略似乎杀死一个演员都是基于异常的消息传递?
答案 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]
之后如果未来成功完成,演员可以向itselfe发送毒丸。
self ! PoisonPill
答案 3 :(得分:0)
有以下方法:
使用上述答案中所述的调度程序发送毒丸
使用调度程序发送“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?
注意:你不能在演员正在做的过程中阻止它。