package akka;
import akka.actor.*;
import akka.routing.*;
import com.typesafe.config.ConfigFactory;
import javax.naming.Context;
import java.util.LinkedList;
import java.util.List;
public class router {
public static class woker extends UntypedActor {
public static enum msg{
DONE,CLOSE
}
@Override
public void onReceive(Object o) throws Throwable {
if(o instanceof String){
System.out.println(o);
}
else if(o== woker.msg.DONE){
System.out.println("工作结束");
}else if(o== woker.msg.CLOSE){
System.out.println("我即将关闭了");
getSender().tell(inbox.woker.msg.CLOSE,getSelf());
Thread.sleep(50);
getContext().stop(getSelf());
}else{
unhandled(o);
}
}
}
public static class watcher extends UntypedActor{
public static Router router;
{
List<Routee> list = new LinkedList<>();
for(int i=0;i<5;i++){
ActorRef actorRef=getContext().actorOf(Props.create(woker.class),"woker_"+i);
//让当前路由监听
getContext().watch(actorRef);
//加入List
list.add(new ActorRefRoutee(actorRef));
}
//使用广播策略
router=new Router(new BroadcastRoutingLogic(),list);
}
@Override
public void onReceive(Object o) throws Throwable {
if(o instanceof String){
//若是string,则让子actor打印,
router.route(o,getSender());
}else if(o instanceof Terminated){
//若是终止信息,则remove,并检查是否没了System.out.println(((Terminated)o).getActor().path()+"is closed");
router.removeRoutee(((Terminated)o).getActor());
if(router.routees().size()==0){
System.out.println("none woker any,shutdoun");
getContext().system().stop(getSelf());
}
}else if(o instanceof woker.msg){
//若是msg类型的,就转发即可
router.route(o,getSender());
}
}
}
public static void main(String[] args) {
ActorSystem system=ActorSystem.create("lifecycle", ConfigFactory.load("akka.conf"));
ActorRef ref=system.actorOf(Props.create(watcher.class),"watcher");
ref.tell("hello,im xiaoheng",ActorRef.noSender());
ref.tell(woker.msg.CLOSE,ActorRef.noSender());
}
}
akka实战项目4--消息路由
最新推荐文章于 2020-11-01 18:19:24 发布