如何设计AKKA主管战略

时间:2015-12-01 13:13:44

标签: akka

我设计了一个演员系统主管策略,如下所示。 MyTopSupervisor是所有参与者的超级主管,以及从子角色升级的所有错误。 我的问题是:我应该处理在顶级主管的儿童演员中升级,重启和停止的所有错误吗?

含义: 我应该重复MyOtherSupervisorMyTopSupervisor处理的所有错误,还是处理MyOtherSupervisor中的低级错误,escalated只处理MyTopSupervisor错误?

class MyTopSupervisor extends UntypedActor {

    private static SupervisorStrategy strategy = new AllForOneStrategy(2,
            Duration.create(5, TimeUnit.MINUTES),

            new Function<Throwable, Directive>() {
                @Override
                public Directive apply(Throwable t) {

                    if (t instanceof SQLException) {
                        log.error("Error: SQLException")
                        return restart()
                    } else if (t instanceof IllegalArgumentException) {
                        log.error("Error: IllegalArgumentException")
                        return stop()
                    } else {
                        log.error("Error: GeneralException")
                        return stop()
                    }
                }
            });

    @Override
    public SupervisorStrategy supervisorStrategy() { return strategy }

    @Override
    void onReceive(Object message) throws Exception {
         // CREATE A CHILD OF MyOtherSupervisor
         // WATCH THE CHILD
         // do something with message
    }
}


class MyOtherSupervisor extends UntypedActor {

    private static SupervisorStrategy strategy = new OneForOneStrategy(2,
            Duration.create(5, TimeUnit.MINUTES),

            new Function<Throwable, Directive>() {
                @Override
                public Directive apply(Throwable t) {

                    if (t instanceof SQLException) {
                        log.error("Error: SQLException")
                        return escalate()
                    } else if (t instanceof IllegalArgumentException) {
                        log.error("Error: IllegalArgumentException")
                        return stop()
                    } else {
                        log.error("Error: GeneralException")
                        return escalate()
                    }
                }
            });

    @Override
    public SupervisorStrategy supervisorStrategy() { return strategy }

    @Override
    void onReceive(Object message) throws Exception {
        // do something with message
    }
}

1 个答案:

答案 0 :(得分:0)

我认为这取决于您尝试对应用程序执行的操作。如果您拥有这些嵌套的主管(TopSupervisor - &gt; MidSupervisor - &gt; ChildWorkerActor)以便具有强大的容错能力,那么我会尝试捕获MidSupervisor中的所有异常并升级真正的异常(显示停止者或意外的)需要由大老板(TopSupervisor)处理。

将其视为百货公司工作中的工作方式。您的员工在场上与客户打交道。当客户遇到问题时,员工无法解决问题,他们会求助于他们的主管。如果主管无法处理,那么他会转向轮班经理或在这种情况下是TopSupervisor。

来自Akka Docs:

  

......演员自然形成等级制度。一个演员,是监督一个   程序中的某些功能可能希望将其任务分解为   更小,更易于管理的作品。为了这个目的,它开始孩子   它监督的演员。

     

http://doc.akka.io/docs/akka/2.4.1/general/actor-systems.html#Hierarchical_Structure

所以要回答你的问题,只要你维持一个层次结构,就不会想要在两个主管中复制例外,因为你不必这样做。

我建议您查看Typesafe的网络研讨会/播客和Akka文档。

https://www.typesafe.com/resources/videos#filter:akka

http://doc.akka.io/docs/akka/2.4.1/java.html