Akka的Hello World(二)Akka的Actor生命周期

(〇)介绍

每当一个Actor停止时,它的所有孩子也会被递归地停止。此行为极大地简化了资源清理,并有助于避免资源泄漏,例如由打开sockets 和文件引起的资源泄漏。实际上,处理低级多线程代码时常常被忽视的困难是各种并发资源的生命周期管理。

要停止一个Actor,推荐的模式是在Actor内部调用getContext().stop(getSelf())来自行停止,通常作为对某些用户定义的停止消息的响应,或者当actor完成其作业时。通过调用getContext().stop(actorRef),停止另一个Actor,但是以这种方式阻止任意Actor被认为是一种不好的做法:应该尝试向他们发送一个PoisonPill或自定义停止消息。

Akka actor API公开了许多可以在Actor实现中覆盖的生命周期钩子。最常用的是preStart()和postStop()。

  • preStart() 在actor开始之后但在它处理第一条消息之前调用。
  • postStop()在actor停止之前调用。此后不会处理任何消息。

让我们在一个简单的实验中使用preStart()和postStop()生命周期钩子来观察我们停止一个Actor时的行为。

(一)创建maven工程并添加依赖。

 

Akka的Hello World(二)Akka的Actor生命周期_第1张图片

(二)编写代码

 

import akka.actor.AbstractActor;
import akka.actor.AbstractActor.Receive;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;

class StartStopActor1 extends AbstractActor {
    static Props props() {
        return Props.create(StartStopActor1.class, StartStopActor1::new);
    }

    @Override
    public void preStart() {
        System.out.println("first started");
        getContext().actorOf(StartStopActor2.props(), "second");
    }

    @Override
    public void postStop() {
        System.out.println("first stopped");
    }

    @Override
    public Receive createReceive() {
        return receiveBuilder()
                .matchEquals(
                        "stop",
                        s -> {
                            getContext().stop(getSelf());
                        })
                .build();
    }
}

class StartStopActor2 extends AbstractActor {

    static Props props() {
        return Props.create(StartStopActor2.class, StartStopActor2::new);
    }

    @Override
    public void preStart() {
        System.out.println("second started");
    }

    @Override
    public void postStop() {
        System.out.println("second stopped");
    }

    // Actor.emptyBehavior is a useful placeholder when we don't
    // want to handle any messages in the actor.
    @Override
    public Receive createReceive() {
        return receiveBuilder().build();
    }
}
public class ActorHierarchyExperiments {
    public static void main(String[] args) throws java.io.IOException {
        ActorSystem system = ActorSystem.create("testSystem");
        ActorRef first = system.actorOf(StartStopActor1.props(), "first");
        first.tell("stop", ActorRef.noSender());
    }
}

(三)运行

Akka的Hello World(二)Akka的Actor生命周期_第2张图片

 (四)分析

当我们停止Actor first 时,它停止了它的子Actor  second,然后停下来。这种排序是严格的,在调用父项的postStop之前调用子项的所有 postStop()。

也就是说所有的子Actor都在父Acor结束之前结束。

你可能感兴趣的:(Akka)