package org.akka.essentials.supervisor.example1;
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.example1.MyActorSystem.Result;
import scala.concurrent.duration.Duration;
import akka.actor.ActorRef;
import akka.actor.OneForOneStrategy;
import akka.actor.Props;
import akka.actor.SupervisorStrategy;
import akka.actor.SupervisorStrategy.Directive;
import akka.actor.UntypedActor;
import akka.japi.Function;
public class SupervisorActor extends UntypedActor {
public ActorRef childActor;
public SupervisorActor() {
childActor = getContext().actorOf(new Props(WorkerActor.class),
"workerActor");
}
private static SupervisorStrategy strategy = new OneForOneStrategy(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 o) throws Exception {
if (o instanceof Result) {
childActor.tell(o, getSender());
} else
childActor.tell(o);
}
}