Akka的Hello World(一)Akka的Actor架构
一、 Actor层次结构
Akka的Actor总会有他的父母。通常,您通过调用getContext().actorOf()创建一个actor 。这不是创建一个“独立”Actor,而是将新Actor作为孩子注入已经存在的树中:创建者Actor成为新创建的子Actor的父级。那么你可能会问,你创建的第一个Actor的父母是谁?
Akka的Actor总是属于父母。通常,您通过调用getContext().actorOf()创建一个actor 。这不是创建一个“独立”Actor,而是将新Actor作为孩子注入已经存在的树中:创建者Actor成为新Actor的子Actor的父级。那么你可能会问,你创建的第一个Actor的父母是谁?
如下图所示,所有Actor都有一个共同的父母,即用户监护人。可以在此actor下使用system.actorOf()创建新的actor实例.创建actor会返回一个有效URL的引用。
例如:如果我们通过system.actorOf(…, "someActor")创建一个someActor,其参考将包括路径/user/someActor
实际上,在代码中创建Actor之前,Akka已经在系统中创建了三个actor。这些内置Actor的名字包含guardian ,因为他们监督他们路径中的每个子Actor。guardian Actor包括:
- / 所谓的根守护者。这是系统中所有actor的父级,也是系统本身终止时停止的最后一个。
- /user 的监护人。这是所有用户创建的actor的父actor。不要让名称user混淆你,它与最终用户无关,也与用户处理无关。使用Akka库创建的每个actor都会在其/user/前面加上常量路径。
- /system 该系统的监护人。
二、代码测试
(一)首先建立maven工程
(二)添加依赖,创建类
<dependency><groupId>com.typesafe.akka</groupId><artifactId>akka-actor_2.12</artifactId><version>2.5.22</version>
</dependency>
如图所示:
(三)编写代码
import akka.actor.AbstractActor;
import akka.actor.AbstractActor.Receive;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;class PrintMyActorRefActor extends AbstractActor {static Props props() {return Props.create(PrintMyActorRefActor.class, PrintMyActorRefActor::new);}@Overridepublic Receive createReceive() {return receiveBuilder().matchEquals("printit",p -> {ActorRef secondRef = getContext().actorOf(Props.empty(), "second-actor");System.out.println("Second: " + secondRef);}).build();}
}
public class ActorHierarchyExperiments {public static void main(String[] args) throws java.io.IOException {ActorSystem system = ActorSystem.create("testSystem");ActorRef firstRef = system.actorOf(PrintMyActorRefActor.props(), "first-actor");System.out.println("First: " + firstRef);firstRef.tell("printit", ActorRef.noSender());System.out.println(">>> Press ENTER to exit <<<");try {System.in.read();} finally {system.terminate();}}
}
(四)运行
(五)分析
代码比较简单。在main函数中firstRef向Actor发送了一条消息。Actor收到消息后进行了处理。
- 两条路径都以akka://testSystem/。由于所有Actor引用都是有效的URL,因此akka://是协议字段的值。
- 接下来,就像在万维网上一样,用URL标识系统。在此示例中,系统已命名testSystem,但它可以是任何其他名称。如果启用了多个系统之间的远程通信,则URL的这一部分包含主机名,以便其他系统可以在网络上找到它。
- 因为第二个actor的引用包含路径/first-actor/,所以它将其标识为第一个的子节点。
- Actor的最后一部分,#后边的一连串数字是在大多数情况下可以忽略的唯一标识符。
Akka的Hello World(一)Akka的Actor架构相关推荐
- Akka之在IoT系统中使用Actor(一)
(一)IoT系统介绍 通过了解Actor的层次结构和行为,剩下的问题是如何将IoT系统的顶层组件映射到actor.将代表设备和仪表板的Actor放在顶层可能很诱人.相反,我们建议创建一个代表整个应用程 ...
- akka mysql_Akka系列(七):Actor持久化之Akka persistence
这次把这部分内容提到现在写,是因为这段时间开发的项目刚好在这一块遇到了一些难点,所以准备把经验分享给大家,我们在使用Akka时,会经常遇到一些存储Actor内部状态的场景,在系统正常运行的情况下,我们 ...
- akka学习教程(十四) akka分布式实战
akka系列文章目录 akka学习教程(十四) akka分布式实战 akka学习教程(十三) akka分布式 akka学习教程(十二) Spring与Akka的集成 akka学习教程(十一) akka ...
- Akka 学习(九)Akka Cluster
参考文章 Gitter Chat,Akka 在线交流平台 Akka Forums,Akka 论坛 Akka in GitHub,Akka 开源项目仓库 Akka Official Website,Ak ...
- java akka 教程_快速入门 Akka Java 指南
快速入门 Akka Java 指南 Akka 是一个用于在 JVM 上构建高并发.分布式和容错的事件驱动应用程序的运行时工具包.Akka 既可以用于 Java,也可以用于 Scala.本指南通过描述 ...
- Akka的Hello World(三)Actor失败处理
父母和孩子在整个生命周期中都是相互联系的.每当一个actor失败(抛出异常或未处理的异常)时,它会暂时中止.如前所述,失败信息将传播到父级,然后父级决定如何处理子actor引起的异常.通过这种方式,父 ...
- Akka入门(二)Akka的Actor模型如何满足现代分布式系统需求
Actor模型允许开发者: 在不诉诸锁定的情况下实施封装. 使用协作实体的模型对信号做出反应,改变状态,并相互发送信号以推动整个应用程序向前发展. 不要担心与我们的世界观不匹配的执行机制. (一) 消 ...
- Akka并发编程——第七节:Actor模型(六)
主要内容: 1. Typed Actor定义 2. Typed Actor创建 3. 消息发送 1. Typed Actor定义 Akka中的Typed Actor是Active Objects设计模 ...
- Akka并发编程——第六节:Actor模型(五)
本章主要内容: 1. !消息发送,Fire-and-Forget消息模型 2. ?消息发送,Send-And-Receive-Future消息模型 Akka提供了两种消息模型:fire-and-for ...
最新文章
- python元组用法详解(定义、下表查找、index()、count()、len())
- 离开当前屏幕的判断方法_掌中宝系列之EMG电动门调整方法
- 解读网络“攻城狮”的发展---老赵带你铺一段路
- 引导界面(二)使用ViewPager实现欢迎引导页面
- 九度 1545:奇怪的连通图
- 【项目管理】人力资源管理
- 百度地图开发总结----3.判断一个点是否在一片区域内
- 【Oracle RAC故障分析与处理】
- iPhone6和iPhone6 plus的iOS8设计尺寸参考指南
- matlab 英语怎么读,MATLAB SPTooL
- linux的python2.7的paramiko_centos7 python2.7下安装paramiko模块
- kuangbin专题五并查集总结
- 3D动漫游戏建模很难学?教你如何使用3DMax和ZBrush制作卡通角色
- nvidia-smi 查看显卡型号
- 服务器状态监控php源码,服务器状态监控_监控Linux服务器网站状态的SHELL脚本
- 六种不同型号的电灯泡
- python 内置函数、匿名函数
- hdu-4966 GGS-DDU 最小树形图
- 微信小程序 全局字体控制(字体大小)
- 人类早期驯服野生CNN卷积神经网络的情景
热门文章
- 域socket(domain socket)和ipsocket(TCP/IP socket)区别
- 放置奇兵 算法 月度活动 破碎时空记录 第六关 尸妖+鹿男(奥博隆)
- 【中级软考】位示图bitmap是什么?(利用二进制的一位来表示磁盘中的一个盘块的使用情况)
- 什么是泛型,为什么要使用泛型? 泛型类和泛型方法的实现以及限定通配符的使用。什么是泛型擦除,为什么有泛型擦除,泛型擦除到底是怎么实现的
- Edward Gaming, the Champion 字符串,模拟(2021.11.沈阳)
- Linux下安装RabbitMQ
- python程序_正确配置Python应用程序
- php trimmsg,c语言实现php的trim标签
- php静态方法场景,深入介绍PHP中的static的修饰方法和yield的使用场景
- ebm风扇选型手册_德国EBM离心风扇的八大结构组成你知道吗?