首页 > 代码库 > Actor Path

Actor Path

Actor Path


Actor路径组成

在理解Actor系统这篇文章中我们知道,actor是以一种严格的层级结构方式被创建的。这有点类似一个文件系统,文件夹内又包含子文件夹,子文件夹又包含子子文件夹,以此类推。我们可以把这个文件系统看成一个文件树。每一个节点都只有唯一的一个访问路径。actor 系统也是如此,这个访问路径就是actor的路径。

技术分享

actor路径地址由各个路径元素连接,从根节点一直到最终的actor。这些路径元素就是在寻找这个actor过程中穿过的父节点名称。各个路径元素用“/"分隔。(有点类似网络地址)


我们可以看一个几个例子:

"akka://my-sys/user/service-a/worker1" // 本地路径 

"akka://my-sys@host.example.com:5678/user/service-b" // 本地或者远程路径 

"cluster://my-cluster/service-c" //集群路径 

关于远程和集群相关内容,后面专门再说,这里主要讨论本地路径内容。


我们看一下本地路径组成:

技术分享

整个路径还是很清晰的。注意user是用户创建的所有的actor的守护actor,是系统自己创建的。system名称是使用ActorSytem.create(...)指定的名称,如果没有指定,系统会设置默认值。


绝对地址 VS 相对地址

ActorSystem 有一个actorFor方法,同样ActorContext也有一个actorFor方法。当我们调用ActorSystem的actorFor方法时使用的就是绝对路径。如果是调用ActorContext的actorFor时,使用的就是相对于当前actor的相对路径。把这个对应于文件系统其实很好理解:如果是在根目录,在查找某个文件时必须使用绝对路径,如果在某个路径内,就可以使用目的地址相对于当前路径的相对路径。看一下下面例子就明白了:

package sample.hello;

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.actor.UntypedActor;

public class LookupActor extends UntypedActor {

    @Override
    public void preStart() {
        // 创建一个名为child的子actor
        getContext().actorOf(Props.create(ChildActor.class), "child");

        ActorRef child = getContext().actorFor("akka://mySystem/user/service/child");
        child.tell("from parent 1", null);
        // 使用相对路径
        child = getContext().actorFor("child");
        child.tell("from parent 2", null);

    }

    @Override
    public void onReceive(Object message) throws Exception {
        System.out.println("service 收到消息 :" + message);
    }

    public static void main(String[] args) {
        // 创建一个actor system,名为mySystem
        ActorSystem system = ActorSystem.create("mySystem");
        // 创建一个名为service的顶级actor
        system.actorOf(Props.create(LookupActor.class), "service");
        // 使用绝对路径获取service
        ActorRef service = system.actorFor("akka://mySystem/user/service");

        // 给service 这个actor发送消息使用的sender为null,表示没有消息可以回复给这个sender
        // Pass [[akka.actor.ActorRef$.noSender]] or `null` as sender if there is nobody to reply to
        service.tell("sss", null);
        // 使用相对路径(相对于根目录的路径)
        service = system.actorFor("user/service");
        service.tell("fff", null);

        // 使用绝对路径获取child actor
        ActorRef child = system.actorFor("akka://mySystem/user/service/child");
        child.tell("sss", null);
        child = system.actorFor("user/service/child");
        child.tell("fff", null);
        system.shutdown();
    }

    static class ChildActor extends UntypedActor {
        @Override
        public void onReceive(Object message) throws Exception {
            System.out.println("child 收到消息: " + message);
        }
    }

}

把上面例子多运行几遍基本就会akka本地路径有个很清晰的认识啦。 

关于akka的远程和集群相关actor路径以后专门再说吧。


==============================END==============================


Actor Path