package org.akka.essentials.supervisor.example2;
import static akka.actor.SupervisorStrategy.escalate;
import static akka.actor.SupervisorStrategy.restart;
import static akka.actor.SupervisorStrategy.resume;
import static akka.actor.SupervisorStrategy.stop;
import org.akka.essentials.supervisor.example2.MyActorSystem2.Result;
import scala.concurrent.duration.Duration;
import akka.actor.ActorRef;
import akka.actor.AllForOneStrategy;
import akka.actor.Props;
import akka.actor.SupervisorStrategy;
import akka.actor.SupervisorStrategy.Directive;
import akka.actor.UntypedActor;
import akka.japi.Function;
public class SupervisorActor2 extends UntypedActor {
public ActorRef workerActor1;
public ActorRef workerActor2;
public SupervisorActor2() {
workerActor1 = getContext().actorOf(new Props(WorkerActor1.class),
"workerActor1");
workerActor2 = getContext().actorOf(new Props(WorkerActor2.class),
"workerActor2");
}
private static SupervisorStrategy strategy = new AllForOneStrategy(10,
Duration.create("10 second"), new Function<Throwable, Directive>() {
public Directive apply(Throwable t) {
if (t instanceof ArithmeticException) {
return resume();
} else if (t instanceof NullPointerException) {
return restart();
} else if (t instanceof IllegalArgumentException) {
return stop();
} else {
return escalate();
}
}
});
@Override
public SupervisorStrategy supervisorStrategy() {
return strategy;
}
public void onReceive(Object msg) throws Exception {
if (msg instanceof Result) {
workerActor1.tell(msg, getSender());
} else
workerActor1.tell(msg);
}
}