저는 여러분이 묻고있는 것을 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
을 조회 한 다음 모든 메시지를 경로 지정하고 올바른 하위 상태 액터로 메시지를 위임 할 수 있습니다. 이것은 분명히 상당히 단순화되었지만, 당신이 원하는 것과 비슷한 것으로 생각됩니다.
감사합니다. 내 질문에 100 % 답했습니다. – Soccertrash