2014-01-22 42 views
4

我需要確定消息的發件人是否是Akka羣集中的本地或遠程角色之一。目前我發現要做到這一點的唯一方法是測試角色發件人是本地還是遠程

def isLocal(sndr: ActorRef) = sndr.path.address.toString == context.system.toString 

什麼是更好的方法?

我用阿卡2.3

更新: 要解釋爲什麼我想這樣做,萬一有完全避免這個問題的一種方式。

在每個節點上,路由器管理許多參與者的工作。工人演員將結果發送回本地主演員,並通過發件人引用分配新作業。主演員還定期將結果發送給其他節點的主演員,以確保數據在不同節點上的主節點之間隨機「混合」。在數據從遠程角色到達的情況下,接收主機不應該嘗試分配新的工作。它基本上是一個混合的島嶼方法的實現。

+0

爲什麼你需要知道? Akka的一個關鍵方面是位置透明度,我會退後一步並問問你自己爲什麼會打破這一點。 – Ryan

回答

2

您可以通過Extension(請參閱Programmatically obtain ephemeral port with Akka)獲取ActorSystem的遠程地址。這樣你就可以比較地址而不是字符串,不那麼黑客。

解決Ryan的觀點,另一種方法是將結果消息包裹在另一個消息中。當你在包裝紙上進行匹配時,你會知道它不是來自本地工人,然後你可以打開它並做任何你需要的結果。

def receive = { 
    case NonLocalResults(results) => // do something with non-local results 
    case Results(...)    => // do something with local results 
    ... 
} 
0

您還可以檢查Senderhost和。本地演員將有empty主機和akka作爲協議,另一方面遠程演員將有效的hostname/ipakka.tcp作爲協議

相關問題