我正在阅读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)
答案 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
提示:创建特定的例外!