了解Akka的主管策略

时间:2016-07-14 16:08:36

标签: java akka

我正在阅读Akka文档,现在我正在关于UntypedActors的部分。我决定尝试一些例子:

以下是我的演员:

private static class MyUntypedActor extends UntypedActor{

    public void onReceive(Object message) throws Exception {
        System.out.println("Recieved: " + message);
    }

    @Override
    public void preStart(){
        getContext().actorOf(AnotherUntypedActor.props()).tell("Process it", getSelf());
    }

    public static Props props(){
        return Props.create(MyUntypedActor.class);
    }
}

private static class AnotherUntypedActor extends UntypedActor{

    public static Props props(){
        return Props.create(AnotherUntypedActor.class);
    }

    public void onReceive(Object message) throws Exception {
        System.out.println("My: " + message);
        throw new RuntimeException("Crashed: " + getSelf());
    }
}

主:

public static void main(String[] args) throws TimeoutException {
    ActorSystem system = ActorSystem.create();
    Inbox inbox = Inbox.create(system);
    ActorRef actorRef = system.actorOf(MyUntypedActor.props());
    inbox.send(actorRef, "Message");
}

所以,我的孩子演员经历过失败,我认为应该以某种方式通知家长。

但我收到的是:

Recieved: Message
My: Process it 
[ERROR] [07/14/2016 19:05:13.726] [default-akka.actor.default-dispatcher-4] [akka://default/user/$a/$a] Crashed: Actor[akka://default/user/$a/$a#-950392568]

监督实际上做了什么?儿童演员出了问题,什么?我在日志中只收到一条错误消息。 supervisorStrategy是什么意思?它默认设置为

OneForOneStrategy(-1,Duration.Inf,true)

1 个答案:

答案 0 :(得分:1)

通过使用主管策略,您可以决定如果失败的话,应该对受监督的演员做些什么。您必须覆盖父actor中的supervisionStrategy()方法并定义策略。即(不确定它是否正确,因为我使用Scala for Akka)

@Override
    public SupervisorStrategy supervisorStrategy() {
        return strategy;
    }

    private static SupervisorStrategy strategy =
            new OneForOneStrategy(10, Duration.create("1 minute"),
                    t -> {
                        if (t instanceof SomeException) {
                            return restart();
                        } else {
                            return stop();
                        }
                    });

在这种情况下,如果发生SomeException,则将重新启动actor。否则,它将被停止。您可以选择四种策略中的一种。 Read documentation

提示:创建特定的例外!