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] 停止了