2014-04-02 25 views
3

是否有類型檢查在阿卡(斯卡拉)的ActorRef任何模式?當我傳遞給其他演員的引用時,我想確保它是正確的類型。然而,得到一個參考時,使用一個演員的context,它總是返回ActorRef,所以我真的不能使用子類進行檢查。如何在注入依賴時檢查Actor/ActorRef的類型?

一個具體的例子如下。在Akka中,我通過將ActorRef傳入另一個Actor的構造函數來注入依賴關係。請看下面的人爲的例子:Speaker被構造有以Listener的參考。我在伴侶對象中創建了一個道具構造函數,正如Akka文檔所鼓勵的那樣。

package test 
import akka.actor._ 

object scratchpad { 
    object Speaker { 
    def apply(listener : ActorRef) : Props = Props(classOf[Speaker],listener) 
    } 

    class Speaker private(listener : ActorRef) extends Actor { 
     override def preStart() = listener ! "knock knock" 
    } 

    class Listener extends Actor { 
    def receive : Receive = { 
     case "knock knock" => 
     //received message 
    } 
    } 

    val system = ActorSystem("test") 
    val listener = system.actorOf(Props[Listener]) 
    val speaker = system.actorOf(Speaker(listener)) 
} 

的問題是,我可以創建其他演員,說DeafMute,並改爲通過這一點 - 但編譯器不會趕上這一點,因爲它是ActorRef型也。有沒有一種模式可以解決這個問題?

回答

3

有一些可能性。

對於一個你無法監聽傳入構造,但使用ActorSelection而不是看它。爲此,你需要知道路徑,然而,這可能是棘手的,取決於你的演員層次結構。我沒有用過這麼多,但是因爲查找是異步的,所以我希望你需要跳過一些環節來避免時間問題,並在尚未初始化時獲取消息。另外我認爲這可能是單元測試中的一個麻煩。

我在其中一個項目中使用的另一種方法是創建一個工廠,根據我想要的演員類型返回actorrefs。當你考慮演員階層和臨時演員時,這可能會變得雜亂無章。該工廠使用依賴注入來創建參與者並將其存儲在內部以允許查找。在我們的用例中工作得很好,單元測試非常好,因爲您可以嘲笑工廠並輕鬆返回testProbe。這需要一些工作來實現,但你需要IndirectActorProducer和更多的東西來使它工作。

除此之外,問題是這是否真的是一個問題。通常你會有「管道」,即連接演員,集中,例如。在層次結構的父節點中。如果您以錯誤的方式連接角色,那麼您的測試應該可以捕捉到這一點,同時您也可以激活未處理消息的日誌記錄需要一些時間來適應它,但沒有檢查到正確的演員連接不是那麼糟糕,你只需要紀律和一套很好的測試。它類似於靜態和動態類型的辯論。