2014-10-07 82 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定義內的行爲,如果需要的話。