2013-06-28 89 views
0

是否可以將一組AKKA actor綁定到某個上下文?將AKKA actor綁定到上下文

E.g.我有三個演員,他們每個人都在實施一個狀態機。這些演員在某些狀態轉換中向對方發送消息。現在我想將這些狀態綁定到上下文,例如用戶上下文。所以我有一個用戶(用userId表示),他有一組actor綁定在某些狀態。只要這個用戶上下文存在,這些角色(或者至少他們的狀態)就必須綁定到用戶的上下文。這在AKKA本身是可能的,還是我必須堅持不同的演員用戶明智的狀態?還是不是爲這些用例設計的演員?

回答

3

我不是100%確定我得到你要問的東西,但我會在一個答案上反正。演員制度本身是平等的。親子關係中存在父母/子女關係,父母將成爲子女的所有者(和主管)。如果你用一個UserContext角色爲你的系統建模三個孩子演員(你的FSM演員),那麼我想孩子們將被綁定到這個UserContext演員實例。考慮這個簡單的例子模型:

class UserContext extends Actor{ 
    val stateA = context.actorOf(Props[StateA]) 
    val stateB = context.actorOf(Props[StateB]) 
    val stateC = context.actorOf(Props[StateC]) 

    def receive = { 
    case _ => 
    } 
} 

class StateA extends Actor{ 
    def receive = { 
    case _ => 
    } 
} 

class StateB extends Actor{ 
    def receive = { 
    case _ => 
    } 
} 

class StateC extends Actor{ 
    def receive = { 
    case _ => 
    } 
} 

如果你設置的東西,這樣一來,孩子的狀態將啓動創建該用戶上下文實例時,當用戶上下文實例停止也將停止。現在,您需要的只是一個小小的代碼,以確保系統中每個用戶只有一個用戶上下文。你可以做這樣的事情,以確保:

object UserContext{    
    def apply(username:String)(implicit system:ActorSystem):ActorRef = { 
    val ctx = system.actorFor("/user/" + username) 
    if (ctx.isTerminated){ 
     try{ 
     system.actorOf(Props[UserContext], username) 
     } 
     catch{ 
     case InvalidActorNameException(msg) if msg.contains("unique") => apply(username) 
     } 
    } 
    else 
     ctx 
    } 
} 

該工廠對象可以確保對用戶名的用戶上下文演員當前沒有運行。如果是,它只是返回該參考。如果沒有,它將啓動並將其綁定到用戶的名稱以便以後查找。

一旦你做了這樣的事情,只需使用工廠查找提供的用戶名UserContext,然後路由所有消息,並讓它委託消息到正確的子狀態actor。這顯然很簡單,但我認爲它可能與你想要的相似。

+0

謝謝,你的回答打100%我的問題! – Soccertrash