咱们已经完成了设备级别的注册支持,如今咱们必须在组级别实现它。在注册时,小组成员还有更多工做要作,包括:html
处理注册请求java
设备组Actor必须将请求转发给现有子项,或者应建立一个。要经过设备ID查找子actor,咱们将使用Map <String,ActorRef>。git
咱们还但愿保留请求的原始发件人的ID,以便咱们的设备角色能够直接回复。这能够经过使用forward而不是tell运算符来实现。二者之间的惟一区别是,forward会保留原始发件人,而tell会将发件人设置为当前的actor。就像咱们的设备actor同样,咱们确保不会响应错误的组ID。将如下内容添加到源文件中:github
正如咱们对设备所作的那样,咱们测试了这个新功能。咱们还测试了返回两个不一样ID的Actor其实是不一样的,咱们还尝试记录每一个设备的温度读数,以查看Actor是否正在响应。测试
若是注册请求已存在设备actor,咱们但愿使用现有的actor而不是新的actor。咱们尚未测试过,因此咱们须要解决这个问题:spa
跟踪组中的设备Actorhtm
到目前为止,咱们已经实现了在组中注册设备actor的逻辑。然而,设备来来去去,因此咱们须要一种从Map <String,ActorRef>中删除设备actor的方法。咱们将假设当移除设备时,其相应的设备actor将中止。正如咱们前面讨论的那样,监督只处理错误状况 - 不是优雅的中止。所以,咱们须要在其中一个设备actor中止时通知父级。
Akka提供死亡观察功能,容许Actor观看另外一个Actor,并在其余Actor中止时收到通知。与监督不一样,观看不只限于父子关系,任何Actor均可以观看任何其余Actor,只要它知道ActorRef便可。在观看的Actor中止以后,观察者接收终止(actorRef)消息,该消息还包含对观看的Actor的引用。观察者能够显式处理此消息,也可使用DeathPactException失败。若是Actor在观看Actor中止后再也不履行本身的职责,后者就颇有用。在咱们的例子中,该组在一个设备中止后仍然应该起做用,所以咱们须要处理Terminated(actorRef)消息。
咱们的设备组Actor须要包含如下功能:
不幸的是,Terminated消息只包含子actor的ActorRef。咱们须要actor的ID将其从现有设备的映射中移除到设备actor映射。为了可以执行此删除,咱们须要引入另外一个占位符Map <ActorRef,String>,它容许咱们找出与给定ActorRef对应的设备ID。
添加识别actor的功能实现:
到目前为止,咱们没法得到组设备主体跟踪的设备,所以,咱们没法测试咱们的新功能。为了使其可测试,咱们添加了一个新的查询功能(消息RequestDeviceList),列出了当前活动的设备ID:
咱们几乎准备好测试设备的移除。可是,咱们仍然须要如下功能:
咱们如今再添加两个测试用例。首先,咱们测试一旦添加了几个设备,咱们就会返回正确的ID列表。第二个测试用例确保在设备actor中止后正确删除设备ID:
要进入层次结构中的下一个级别,咱们须要在DeviceManager源文件中为设备管理器组件建立入口点。此actor与设备组actor很是类似,可是建立设备组actor而不是设备actor:
咱们将设备管理器的测试留做练习,由于它与咱们为组Actor编写的测试很是类似
咱们如今有一个分层组件,用于注册和跟踪设备和记录测量。咱们已经了解了如何实现不一样类型的会话模式,例如:
在下一章中,咱们将介绍组查询功能,它将创建一个新的分散 - 汇集对话模式。特别是,咱们将实现容许用户查询属于组的全部设备的状态的功能。
下节再续!
原文:https://doc.akka.io/docs/akka/2.5/guide/tutorial_4.html
有什么讨论的内容,能够加我公众号: