package org.akka.essentials.unittest.actors; import static akka.actor.SupervisorStrategy.escalate; import static akka.actor.SupervisorStrategy.resume; import static akka.actor.SupervisorStrategy.stop; 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; import akka.util.Duration; public class SupervisorActor extends UntypedActor { private ActorRef childActor; public ActorRef getChildActor() { return childActor; } private static SupervisorStrategy strategy = new OneForOneStrategy(10, Duration.parse("10 second"), new Function<Throwable, Directive>() { public Directive apply(Throwable t) { if (t instanceof IllegalArgumentException) { return stop(); } else if (t instanceof NullPointerException) { return resume(); } else return escalate(); } }); @Override public SupervisorStrategy supervisorStrategy() { return strategy; } public void onReceive(Object o) throws Exception { if (o instanceof Props) { this.childActor = getContext().actorOf((Props) o, "childActor"); sender().tell(childActor); } else childActor.tell(o, sender()); } }