Akka向设备组添加Actor注册《thirteen》译

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

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

处理注册请求java

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

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

Full source at GitHubide

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

Full source at GitHubui

若是注册请求已存在设备actor,咱们但愿使用现有的actor而不是新的actor。咱们尚未测试过,因此咱们须要解决这个问题:spa

Full source at GitHub3d

跟踪组中的设备Actorhtm

到目前为止,咱们已经实现了在组中注册设备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

有什么讨论的内容,能够加我公众号:

相关文章
相关标签/搜索