2016-06-18 4 views
0

많은 아역 배우를 생성하는 감독자 배우가 있다는 AKKA 모델이 있습니다. 어린이 배우는 이벤트를 처리하고 다른 서비스 (예 : 카프카 주제)로 메시지를 보냅니다.다른 배우들과 배우 공유하기

현재 메시지를 보내기 위해 자식 액터간에 공유되는 정적 공유 클래스가 있지만 액터 모델에서는이 액터를 사용하는 것이 더 좋습니다.

자식 배우가 공유 할 수있는 배우를 어떻게 만들 수 있는지 알고 싶습니다. 관리자 액터가 MessagePublisher 액터를 생성하면 아이들은 메시지를 메시지에 보낼 수 있습니까?

은 최상위 수준 또는 관리자에 아이 Actor로 공유 Actor을 만들 수 있습니다 사용 사례에 따라 당신에게

답변

0

감사드립니다. 그러면 메시지 또는 생성자를 감독자/자식 액터에 사용하고 Actor 내부 상태로 유지하는 것만으로 ActorRef을 전달하면됩니다.

다음 코드는 그것을 설명해야합니다 (스칼라이지만 자바로 변환하기가 쉽습니다).

package test 

import akka.actor.Actor.Receive 
import akka.actor.{Actor, ActorRef, ActorSystem, Props} 
import akka.stream.ActorMaterializer 

object TestClass extends App { 

    implicit val system = ActorSystem("ActorSystem") 

    implicit val executor = system.dispatcher 

    implicit val materializer = ActorMaterializer() 

    //Option 1 Create as top level actor and pass to supervisor with init message 
    val sharedActor: ActorRef = system.actorOf(Props[ SharedActor ]) 

    val supervisor: ActorRef = system.actorOf(Props[ SupervisorActor ]) 
    supervisor ! InitWithSharedActor(sharedActor) 

    supervisor ! "NoArgsChild" 
    supervisor ! "ArgsChild" 

    class SupervisorActor extends Actor { 
      private var sharedActor: Option[ ActorRef ] = None 

      override def preStart() = { 
        //Option 2 Init as child actor of supervisor 
        println("Start Supervisor") 
        sharedActor = Some(context.actorOf(Props[ SharedActor ])) 
      } 

      override def receive: Receive = { 
        case InitWithSharedActor(sa) => 
          sharedActor = Some(sa) 
        case "NoArgsChild" => 
          //Pass to child actor in init msg 
          sharedActor.foreach(sa => context.actorOf(Props[ ChildActor ]) ! InitWithSharedActor(sa)) 
        case "ArgsChild" => 
          //Pass to child with constructor 
          sharedActor.foreach(sa => context.actorOf(Props(new ChildActorWithArgs(sa)))) 
      } 
    } 

    class SharedActor extends Actor { 

      override def preStart() = { 
        println("Start Shared Actor") 
      } 

      override def receive: Receive = { 
        case _ => 
      } 
    } 

    class ChildActor extends Actor { 
      private var sharedActor: Option[ ActorRef ] = None 

      override def preStart() = { 
        println("Start NoArg Child Actor") 
      } 

      override def receive: Receive = { 
        case InitWithSharedActor(sa) => sharedActor = Some(sa) 
      } 
    } 

    class ChildActorWithArgs(sharedActor: ActorRef) extends Actor { 

      override def preStart() = { 
        println("Start WithArg Child Actor") 
      } 

      override def receive: Receive = { 
        case _ => 
      } 
    } 

    case class InitWithSharedActor(sharedActor: ActorRef) 

}