我们已经完成了设备级别的注册支持,现在我们必须在组级别实现它。在注册时,小组成员还有更多工作要做,包括:

  • 通过将注册请求转发给现有设备actor或通过创建新actor并转发消息来处理注册请求。
  • 跟踪组中存在哪些设备Actor,并在组停止时从组中删除它们。

处理注册请求

设备组Actor必须将请求转发给现有子项,或者应创建一个。要通过设备ID查找子actor,我们将使用Map <String,ActorRef>。

我们还希望保留请求的原始发件人的ID,以便我们的设备角色可以直接回复。这可以通过使用forward而不是tell运算符来实现。两者之间的唯一区别是,forward会保留原始发件人,而tell会将发件人设置为当前的actor。就像我们的设备actor一样,我们确保不会响应错误的组ID。将以下内容添加到源文件中:

Full source at GitHub

正如我们对设备所做的那样,我们测试了这个新功能。我们还测试了返回两个不同ID的Actor实际上是不同的,我们还尝试记录每个设备的温度读数,以查看Actor是否正在响应。

Full source at GitHub

如果注册请求已存在设备actor,我们希望使用现有的actor而不是新的actor。我们还没有测试过,所以我们需要解决这个问题:

Full source at GitHub

跟踪组中的设备Actor

到目前为止,我们已经实现了在组中注册设备actor的逻辑。然而,设备来来去去,所以我们需要一种从Map <String,ActorRef>中删除设备actor的方法。我们将假设当移除设备时,其相应的设备actor将停止。正如我们前面讨论的那样,监督只处理错误情况 - 不是优雅的停止。因此,我们需要在其中一个设备actor停止时通知父级。

Akka提供死亡观察功能,允许Actor观看另一个Actor,并在其他Actor停止时收到通知。与监督不同,观看不仅限于父子关系,任何Actor都可以观看任何其他Actor,只要它知道ActorRef即可。在观看的Actor停止之后,观察者接收终止(actorRef)消息,该消息还包含对观看的Actor的引用。观察者可以显式处理此消息,也可以使用DeathPactException失败。如果Actor在观看Actor停止后不再履行自己的职责,后者就很有用。在我们的例子中,该组在一个设备停止后仍然应该起作用,因此我们需要处理Terminated(actorRef)消息。

我们的设备组Actor需要包含以下功能:

  1. 在创建新设备Actor时开始观察它们。
  2. 当通知指示已停止时,从Map <String,ActorRef>中删除设备actor,该设备actor将设备映射到设备actor。

不幸的是,Terminated消息只包含子actor的ActorRef。我们需要actor的ID将其从现有设备的映射中移除到设备actor映射。为了能够执行此删除,我们需要引入另一个占位符Map <ActorRef,String>,它允许我们找出与给定ActorRef对应的设备ID。

添加识别actor的功能实现:

Full source at GitHub

到目前为止,我们无法获得组设备主体跟踪的设备,因此,我们无法测试我们的新功能。为了使其可测试,我们添加了一个新的查询功能(消息RequestDeviceList),列出了当前活动的设备ID:

Full source at GitHub

我们几乎准备好测试设备的移除。但是,我们仍然需要以下功能:

  1. 从我们的测试用例中停止设备actor。从外面看,任何Actor都可以通过发送特殊的内置消息PoisonPill来停止,该消息指示Actor停止。
  2. 在设备actor停止后收到通知。我们也可以将Death Watch设施用于此目的。TestKit有两个我们可以轻松使用的消息,watch()来监视一个特定的actor,而expectTerminated断言被监视的actor已被终止。

我们现在再添加两个测试用例。首先,我们测试一旦添加了几个设备,我们就会返回正确的ID列表。第二个测试用例确保在设备actor停止后正确删除设备ID:

Full source at GitHub

创建设备管理器角色

要进入层次结构中的下一个级别,我们需要在DeviceManager源文件中为设备管理器组件创建入口点。此actor与设备组actor非常相似,但是创建设备组actor而不是设备actor:

Full source at GitHub

我们将设备管理器的测试留作练习,因为它与我们为组Actor编写的测试非常相似

What’s next?

我们现在有一个分层组件,用于注册和跟踪设备和记录测量。我们已经了解了如何实现不同类型的会话模式,例如:

  1. Request-respond(用于温度记录)
  2. Delegate-respond(用于设备注册)
  3. Create-watch-terminate(用于创建组和设备actor作为子项)

在下一章中,我们将介绍组查询功能,它将建立一个新的分散 - 聚集对话模式。特别是,我们将实现允许用户查询属于组的所有设备的状态的功能。

下节再续!

原文:https://doc.akka.io/docs/akka/2.5/guide/tutorial_4.html

有什么讨论的内容,可以加我公众号:

Akka向设备组添加Actor注册《thirteen》译相关推荐

  1. Akka与设备组一起工作《twelve》译

    Dependency 在项目中添加以下依赖项: 介绍: 让我们仔细看看我们的用例所需的主要功能,在用于监控家庭温度的完整物联网系统中,将设备传感器连接到我们系统的步骤可能如下所示: 家中的传感器设备通 ...

  2. Akka查询设备组《fourteen》译

    加入以下依赖到项目中: 介绍: 到目前为止,我们看到的会话模式很简单,因为它们要求Actor保持很少或没有状态. 特别: 设备actor返回一个读数,不需要更改状态. 记录温度,更新单个字段. 设备组 ...

  3. DLNA设备、服务的注册及响应

    DLNA设备.服务的注册及发现(依赖开源库cling) 本文是跟踪代码的记录,因为wifi网络不太好,不能debug跟踪,后面在能够但不跟踪时,会理一下,设备之间的连接过程,及音视频数据的传递过程. ...

  4. platform设备的添加

    今天我以fb设备的注册过程来分析platform设备的添加流程 platform总线是kernel中最近加入的一种虚拟总线,它被用来连接处在仅有最少基本组件的总线上的那些设备.这样的总线包括许多片上系 ...

  5. 利用Amazon Lambda实现Amazon IoT设备证书的即时注册

    背景介绍 为了保证通信的安全性,Amazon IoT设备与Amazon IoT Core的MQTT通信使用基于证书的TLS 1.2双向认证体系.所谓的双向认证,即意味着Amazon IoT设备端需安装 ...

  6. 关于驱动和设备的相关的注册表键的位置,和相关信息

    关于驱动和设备的相关的注册表键的位置,和相关信息 MSDN上有了: https://msdn.microsoft.com/en-us/library/windows/hardware/ff549815 ...

  7. AKHQ:用于Apache Kafka管理主题、主题数据、消费者组、模式注册表、连接等的Kafka GUI。。。

    参考文章:https://www.5axxw.com/wiki/content/q7nyiu AKHQ(以前称为KafkaHQ) 用于Apache Kafka管理主题.主题数据.消费者组.模式注册表. ...

  8. 【linux iic子系统】i2c设备的添加方法(四)

    文章目录 前言 一.静态注册 二.动态注册 三.用户空间注册 四.i2c驱动扫描注册 前言 I2C设备的4种添加方法: 1)静态注册 2)动态注册 3)用户空间注册 4)i2c驱动扫描注册 一.静态注 ...

  9. R语言ggplot2可视化分面图(facet_grid):ggplot2可视化为分面图的每个组添加平均值线条

    R语言ggplot2可视化分面图(facet_grid):ggplot2可视化为分面图的每个组添加平均值线条 目录

最新文章

  1. 【软件工程】CMMI 能力成熟度模型集成 ( 简介 | 相关术语 | CMMI 等级评估次序 )
  2. 生成对象---工厂方法模式
  3. bellman ford java_Java C 实现Bellman-ford算法
  4. 【课题总结】OpenCV 抠图项目实战(5)自适应阈值抠图
  5. 民科微服务小程序怎么注册_民科微服务小程序(医师护士电子化注册系统入口)公众号...
  6. 部队计算机考试题,2020军队文职计算机知识:计算机考试练习题(1)
  7. Android Framebuffer设置分辨率
  8. SparkSQL统一数据的加载与落地
  9. 云存储市场上演“新三国演义”
  10. win10共享计算机win7,win7和win10共享文件怎么设置_win10和win7建立局域网共享操作方法...
  11. Scratch二次开发6:如何保存作品到自己的服务器
  12. 交友约会APP源码大家有吗
  13. 关于我的 “二进制部署 kubernetes 集群” 的体验
  14. h5唤起App两种方式 Schema Universal Link
  15. 库克开怼谷歌和Facebook:自己搞的烂摊子,要会自己收拾
  16. Error serializing object. Cause: java.io.NotSerializableException: com.qi
  17. STM32F简单应用
  18. Android获取定位经纬度
  19. 2020春节假期VR/AR资讯汇总
  20. 天敏机顶盒T2四核增强强制安装驱动和刷机(转载且实践认证过)

热门文章

  1. 直指Adobe的龌龊行径
  2. 如何把 Google adsense 的广告放到博客的Banner位置
  3. FPGA开发设计必经之路:时序分析
  4. Linux(centos)下安装JDK
  5. Android开发--Button的应用
  6. ISO8583报文格式分析
  7. springmvc国际化 基于请求的国际化配置
  8. 1.1 Application Fundamentals - 应用原理
  9. tensorflow随笔——Yolo v1
  10. 【学习OpenCV4】在OpenCV中响应键盘与鼠标操作