2013-06-28 3 views
0

AKKA 액터 세트를 특정 컨텍스트에 바인딩 할 수 있습니까?AKKA 액터를 컨텍스트에 바인딩

예. 세 명의 배우가 있으며 각자가 상태 시스템을 구현하고 있습니다. 이러한 액터는 특정 상태 전환시 서로에게 메시지를 보냅니다. 이제이 상태를 컨텍스트에 바인딩하려고합니다. 사용자 컨텍스트 그래서 나는 특정 주에서 바인드 된 액터 세트를 가진 사용자 (userId로 대표되는)를가집니다. 이 사용자 컨텍스트가 존재하는 한 이러한 액터 (또는 적어도 그들의 상태)는 사용자 컨텍스트에 바인딩되어야합니다. AKKA에서 이것이 가능한가요? 아니면 다른 배우들의 상태를 사용자 중심으로 유지해야합니까? 아니면 이러한 유스 케이스를 위해 설계되지 않은 액터입니까?

답변

3

저는 여러분이 묻고있는 것을 100 % 확신하지는 못하지만 어쨌든 나는 대답 할 것입니다. 배우 시스템 자체가 계층 적입니다. 부모/자녀 관계는 계층에 존재하며 부모는 자녀에 대한 소유자 (및 감독자)가됩니다. UserContext 액터가 3 명의 자식 액터 (당신의 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을 조회 한 다음 모든 메시지를 경로 지정하고 올바른 하위 상태 액터로 메시지를 위임 할 수 있습니다. 이것은 분명히 상당히 단순화되었지만, 당신이 원하는 것과 비슷한 것으로 생각됩니다.

+0

감사합니다. 내 질문에 100 % 답했습니다. – Soccertrash

관련 문제