【问题标题】:How to kill an Akka actor after X amount of time?X时间后如何杀死Akka演员?
【发布时间】:2014-12-02 01:06:09
【问题描述】:

有没有一种机制可以在创建 20 秒后杀死一个演员?

http://doc.akka.io/docs/akka/snapshot/java/fault-tolerance.html阅读各种 SuperVisor 策略

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

【问题讨论】:

  • 您可以使用调度器在 20 秒后向 actor 发送 PoisonPill 消息,这将杀死 actor。
  • @ChrisK 我对akka一无所知。演员必须自己处理药丸还是内置药丸?
  • @SotiriosDelimanolis 演员框架将为您处理它;我在下面的答案中包含了参考资料。

标签: java akka


【解决方案1】:

你可以使用Scheduler在20s后向actor发送PoisonPill消息,这将在actor处理该消息时自动杀死actor;演员内不需要额外的代码。如果您想立即杀死演员,而不是等待毒丸通过消息队列,请改用stop

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

【讨论】:

  • 谢谢,我如何检查 testActor 何时将 PoisonPill 发送给它? onReceive 中是否有允许我检查是否已发送 PoisonPill 消息的类型?
  • @blue-sky 演员会死,所以演员问这个问题没什么意义。有一些关闭钩子可以用来触发额外的行为,或者你可以让演员安排自己的死亡。我已经回答了您最初提出的问题,但您最后的评论让我想知道您实际上想要做什么?
  • 我只是想要一种监控哪些演员被杀的方法。我接受你的观点,问题得到了回答,但我不知道如何验证演员被杀。
  • @blue-sky。我记得前段时间遇到过类似的问题。我不记得我是如何解决它的,明天我会为你做一些挖掘。但是,如果我没记错的话,当 Akka 添加集群时,一切都变了,我还没有在愤怒中使用过。
  • @blue-sky 看起来DeathWatch 组件会告诉你演员何时死亡;这是一项基于订阅的服务。阅读doc.akka.io/docs/akka/2.3.6/java/…
【解决方案2】:

akka 库中似乎有一个功能可以解决这个问题。我自己没用过,但听起来很有希望:after[T]

Documentation about it here

如果未来成功完成,演员可以给自己送一颗毒丸。

self ! PoisonPill

【讨论】:

    【解决方案3】:

    与 Chris K 的回答类似,但采用稍微不同的方法,您可以让演员安排 PoisonPill 消息在 preStart 钩子执行期间的 20 秒后发送给自己,例如

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

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

    【讨论】:

      【解决方案4】:

      有以下几种方法:

      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?

      注意:你不能在演员正在做的事情中停下来。

      【讨论】:

        猜你喜欢
        • 2014-12-03
        • 2014-06-13
        • 2021-04-17
        • 2017-09-09
        • 2014-01-26
        • 2016-01-20
        • 2011-11-17
        • 1970-01-01
        • 2018-07-12
        相关资源
        最近更新 更多