akka实战项目4--消息路由

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());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值