首页 > 代码库 > 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