2014-10-07 50 views
1

有没有一种机制可以在创建20秒后杀死一名演员?如何在X时间后杀死Akka actor?

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

阅读有关各主管战略似乎杀死一个演员都是基于消息传递的异常?

+0

您可以使用计划程序在20秒后向演员发送PoisonPill消息,这会杀死演员。 – 2014-10-07 14:51:44

+0

@ChrisK我对阿卡一无所知。演员是否必须自己处理药片还是内置药片? – 2014-10-07 14:52:18

+1

@SotiriosDelimanolis演员框架将为您处理;我在下面的答案中包含了参考文献。 – 2014-10-07 15:01:58

回答

4

您可以使用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()); 
+0

谢谢,我该如何检查testActor何时将PoisonPill发送给它? onReceive中是否有类型允许我检查是否发送了PoisonPill消息? – 2014-10-07 16:17:14

+0

@ blue-sky这位演员将会死去,演员提出这个问题的点点点滴滴。有关闭钩子可以用来触发额外的行为,或者你可以让演员安排自己的死亡。我回答了你最初提出的问题,但是你最后的评论让我想知道你实际上想要做什么? – 2014-10-07 16:20:51

+0

我只想要一个监视什么角色被杀的方法。我接受你的观点,这个问题得到解答,但我不知道如何验证一个演员是否被杀死。 – 2014-10-07 16:24:27

0

akka库似乎有一个功能来解决这个问题。没有使用它在我自己的,但声音的promissing:后[T]

Documentation about it here

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

self ! PoisonPill 
2

克里斯K公司的答案相似,但采取了略微不同的方法,你可以把演员安排PoisonPill消息在20秒后开始前钩的执行过程中,例如发送给自己

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

这会保持UntypedActor定义内的行为,如果需要的话。