Actor生命周期---停止actor

Actor生命周期包括:创建并启动,恢复运行,重启,停止四个阶段。

启动:actorOf方法创建,拥有指定的path,uid。 启动会默认调用preStart(),可以在这里干些资源化的工作。
恢复:通过容错机制,让actor恢复并继续运行,这时可以延用之前的实例,状态还在。
重启
1、调动旧实例的preRestart方法(停掉所有子级actor,并调用postStop方法)
2、创建新的实例,在新实例上调用postRestart (默认调用preStart)
停止:停止的时候会调用你postStop,同事发送一条Terminated消息给自己的监控者,告知自己的状态。

一、停止actor的几种方式

/**
 * 停止actor
 * Created by tzq on 2018/10/6.
 */
public class WorkerAcotor extends UntypedActor {
    LoggingAdapter log =Logging.getLogger(this.getContext().system(),this);
    @Override
    public void onReceive(Object message) {
        System.out.println("收到消息:" + message);
    }

    @Override
    public void postStop() throws Exception {
        log.info("WorkerAcotor stop");
    }

    public static void main(String[] args) {
        ActorSystem system = ActorSystem.create("sys");
        ActorRef ref = system.actorOf(Props.create(WorkerAcotor.class), "worker");

        //停止actor (3种方式)
        ref.tell(PoisonPill.getInstance(),ActorRef.noSender()); 
//        ref.tell(Kill.getInstance(),ActorRef.noSender()); 
//        system.stop(ref);
    }
}

二、事件监听

package akka;

import akka.actor.*;
import akka.event.Logging;
import akka.event.LoggingAdapter;

/**
 * 停掉Actor
 * Created by tzq on 2018/10/6.
 */
public class WatchActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(this.getContext().system(),this);

    ActorRef child = null;


    @Override
    public void preStart() throws Exception {
        child = getContext().actorOf(Props.create(WorkerAcotor.class),"WorkerActor");
        getContext().watch(child);
//        getContext().unwatch(child); //解除监控
    }

    @Override
    public void onReceive(Object msg) {
        if (msg instanceof String) {
            if (msg.equals("stopChild")) {
                getContext().stop(child);
            }

        } else if ( msg instanceof Terminated) {
            Terminated t = (Terminated) msg;
            log.info("监控到:" + t.getActor()+ " 停止了");
        } else {
            unhandled(msg);
        }

    }

    @Override
    public void postStop() throws Exception {
        log.info("WatchActor stop");
    }

    public static void main(String[] args) {
        ActorSystem system = ActorSystem.create("sys");
        ActorRef ref = system.actorOf(Props.create(WatchActor.class), "WatchActor");

        //停止actor
//        ref.tell(PoisonPill.getInstance(),ActorRef.noSender());
//        ref.tell(Kill.getInstance(),ActorRef.noSender());
//        system.stop(ref);

        ref.tell("stopChild",ActorRef.noSender());
//        system.stop(ref);


    }
}

//[INFO] [10/06/2018 19:02:41.474] [sys-akka.actor.default-dispatcher-4] [akka://sys/user/WatchActor/WorkerActor] WorkerAcotor stop
//[INFO] [10/06/2018 19:02:41.492] [sys-akka.actor.default-dispatcher-6] [akka://sys/user/WatchActor] 监控到:Actor[akka://sys/user/WatchActor/WorkerActor#-1896883157] 停止了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值