博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Actor Path
阅读量:7000 次
发布时间:2019-06-27

本文共 2804 字,大约阅读时间需要 9 分钟。

hot3.png

Actor Path

Actor路径组成

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

165056_P9KW_578710.png

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" //集群路径 

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

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

170614_1A07_578710.png

整个路径还是很清晰的。注意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==============================

转载于:https://my.oschina.net/xinxingegeya/blog/364735

你可能感兴趣的文章
netty reactor线程模型分析
查看>>
如何使用Photoshop(PS)将图片的底色变为透明
查看>>
DBMS_LOB的简单用法以及释放DBMS_LOB生成的临时CLOB内存
查看>>
IDEA实现序列号接口
查看>>
应用Observer接口实践Observer模式
查看>>
CSS样式案例(2)-制作一个简单的登录界面
查看>>
cnpm的使用
查看>>
python创建多层目录的方式
查看>>
人件札记:保持高效的办公室环境
查看>>
推荐一个好工具:P/Invoke Interop Assistant【转】
查看>>
while(cin>>word)时的结束方法
查看>>
看了潘爱民老师的关于smartcache for webkit的paper
查看>>
动态给表添加删除字段并同时修改它的插入更新存储过程
查看>>
NYOJ-68 三点顺序 --有向面积
查看>>
jdbc详解(一)
查看>>
Linux设备驱动程序学习之分配内存
查看>>
【iCore3 双核心板_ uC/OS-III】例程十:消息队列
查看>>
webstorm入手笔记
查看>>
包含文件(Include file)
查看>>
验证用户必选CheckBox控件
查看>>