1可以通过procedure来定义状态,并通过getContext.become来转化状态
package akka;
import akka.actor.*;
import akka.japi.Procedure;
import com.typesafe.config.ConfigFactory;
public class produce {
public static class child extends UntypedActor{
public static enum msg{
sleep,play,close,
}
Procedure<Object> angry=new Procedure<Object>() {
@Override
public void apply(Object o) throws Exception {
if(o==msg.sleep){
System.out.println("im already angry,dont let me sleep");
}else if(o==msg.play){
System.out.println("im becoming happy from angry");
getContext().become(happy);
}else unhandled(o);
}
};
Procedure<Object> happy=new Procedure<Object>() {
@Override
public void apply(Object o) throws Exception {
if(o==msg.play){
System.out.println("im still happy");
}else if(o==msg.sleep){
System.out.println("i dont want to sleep,i still want to play");
getContext().become(angry);
}else unhandled(o);
}
};
@Override
public void onReceive(Object o) throws Throwable {
System.out.println("receive msg"+o);
if(o==msg.sleep){
getContext().become(angry);
}else if(o==msg.play){
getContext().become(happy);
}else unhandled(o);
}
}
public static void main(String[] args) {
ActorSystem system=ActorSystem.create("hello", ConfigFactory.load("akka.conf"));
ActorRef ref=system.actorOf(Props.create(child.class),"child");
ref.tell(child.msg.play,ActorRef.noSender());
ref.tell(child.msg.play,ActorRef.noSender());
ref.tell(child.msg.sleep,ActorRef.noSender());
ref.tell(child.msg.play,ActorRef.noSender());
ref.tell(PoisonPill.getInstance(),ActorRef.noSender());
}
}