littlemujiang.github.io

View the Project on GitHub

2.Actor基础:创建Actor并发送消息

“上面我们启动了ActorSystem,但是什么都没有,现在我们在里面创建一个actor,并给它发送消息。”


[TOC]

在上一篇的例子里,我们启动ActorSystem后什么也没干,现在改造RootBehavior.create()的逻辑,在里面创建actor。

actor需要定义与创建:

如下所示:

    public static class RootBehavior {
        static Behavior<Void> create() {
            return Behaviors.setup(context -> {
                        // 创建一个actor,并给它发送消息
                        ActorRef<String> hello = context.spawn(HelloWorldActor.create(), "HelloWorld");
                        hello.tell("hi");
                        
                        return Behaviors.empty();
                    }
            );
        }
    }

创建actor

创建/实例化一个actor是下面这句:

ActorRef<String> hello = context.spawn(HelloWorldActor.create(), "HelloWorld");

其中:

定义actor

下面主要看下actor类的定义,即HelloWorldActor

public class HelloWorldActor extends AbstractBehavior<String> {

    //常规操作:私有化构造方法
    private HelloWorldActor(ActorContext<String> context) {
        super(context);
    }

    //常规操作:通过create()静态方法返回经过封装的Behavior
    public static Behavior<String> create() {
//        return Behaviors.setup(HelloWorldActor::new);
        return Behaviors.setup(context -> new HelloWorldActor(context));
    }

    @Override
    public Receive<String> createReceive() {
        return newReceiveBuilder()
                .onMessage(String.class, this::onMsg)
                .build();
    }
    //收到消息后,会进入此方法,即在此方法中实现处理消息的逻辑
    private Behavior<String> onMsg(String msg) {
        log.info("****** hello world actor"+ " 收到消息:{} \t", msg);
        return this;
    }

}

这里面有几个需要关注的点:

  1. actor类需要继承自Behavior,通常继承官方封装过的AbstractBehavior。
  2. 私有化actor类的构造方法,通过create()静态方法提供经过Behaviors.setup()封装过的实例。(官方写法,可能是因为akka不希望在别的地方创建和使用actor类的对象)
  3. 重写createReceive()方法,在里面指定收到消息后需要调用的方法,即onMsg(),并实现onMsg()
  4. 注意:在onMsg()方法中,记得return this,只有这样,才能保证这个actor能执行和之前相同的逻辑。如果return Behaviors.empty()或者其他的Behavior,将改变此actor的行为,这在后面停止actor时会用到。

这样,我们就实现了actor的定义和创建,并能给这个actor发消息。