Actor的生命周期

  1. 一个Actor在actorOf()函数被调用后开始建立,Actor实例创建后,会回调preStart()方法。在这个方法里,我们可以进行x些资源的初始化工作。
  2. 在Actor的工作过程中,可能会出现一些异常,这种情况下,Actor会需要重启。当Actor被重启时,会回调preRestart()方法(在老的实例上),接着系统会创建一个新的Actor对象实例(虽然是新的实例,但它们都表示同一个Actor)。当新的Actor实例创建后,会回调postRestart()方法,表示启动完成,同时新的实例将会代替旧的实例。
  3. 停止一个Actor也有很多方式,你可以调用stop()方法或者给Actor发送一个PosionPill(毒药丸)。Actor停止时,postStop()方法会被调用,同时这个Actor的监视者会收到一个Terminated消息。

实例

public class MyWorker extends UntypedActor {

    private final LoggingAdapter log = Logging.getLogger(getContext().system(), this);

    public static enum Msg {
        WORKING, DONE, CLOSE;
    }

    // 开始之前,初始化一些资源
    @Override
    public void preStart() throws Exception {
        System.out.println("MyWorker is starting");
    }

    // 停止之后,进行资源的释放
    @Override
    public void postStop() throws Exception {
        System.out.println("MyWorking is stoping");
    }

    @Override
    public void onReceive(Object msg) throws Exception {
        if (msg == Msg.WORKING) {
            System.out.println("I am working");
        }
        if (msg == Msg.DONE) {
            System.out.println("Stop working");
        }
        if (msg == Msg.CLOSE) {
            System.out.println("I will shutdow");

            getSender().tell(Msg.CLOSE, getSelf());

            // getContext()为当前Actor的上下文
            getContext().stop(getSelf());
        } else {
            unhandled(msg);
        }
    }
}

/**
 * @author bzb
 * @Description: 监视者,如同劳动监工一样,一旦被监视者因为停止工作,则监视者就会收到一条消息
 * @date 2018/9/14 14:27
 */
public class WatchActor extends UntypedActor {

    private final LoggingAdapter log = Logging.getLogger(getContext().system(), this);

    public WatchActor(ActorRef actorRef) {
        getContext().watch(actorRef); // 在当前的上下文中观察被监视者Actor
    }

    @Override
    public void onReceive(Object msg) throws Exception {
        if (msg instanceof Terminated) { // Actor终止消息
            System.out.println(String.format("%s has terminated, shutting down system", ((Terminated) msg).getActor().path()));
            // 关闭整个ActorSystem
            getContext().system().shutdown();
        } else {
            unhandled(msg);
        }
    }
}

public class DeadMain {
    public static void main(String[] args) {
        ActorSystem system = ActorSystem.create("deadwatch", ConfigFactory.load("samplehello.conf"));

        // 创建MyWorker对象
        ActorRef worker = system.actorOf(Props.create(MyWorker.class), "worker");

        // 创建监视者对象
        system.actorOf(Props.create(WatchActor.class, worker), "watcher");

        // 向worker对象发送消息
        worker.tell(MyWorker.Msg.WORKING, ActorRef.noSender());

        worker.tell(MyWorker.Msg.DONE, ActorRef.noSender());

        // 构造毒丸对象并向worker发送,则worker被毒死而终止
        worker.tell(PoisonPill.getInstance(), ActorRef.noSender());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值