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

有什麼討論的內容,能夠加我公衆號:

相關文章
相關標籤/搜索