咱們已經完成了設備級別的註冊支持,如今咱們必須在組級別實現它。在註冊時,小組成員還有更多工做要作,包括: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
有什麼討論的內容,能夠加我公衆號: