2016-06-18 152 views
0

我有一个AKKA模型,有一个主管演员创建许多儿童演员。小孩演员会处理一个事件并将消息发送到另一个服务(例如Kafka话题)。与其他演员共享演员

目前我有一个静态共享类,在儿童演员之间共享发送消息,但在演员模型中,我认为最好使用演员来达到此目的。

我想知道如何创建一个演员,让小孩演员可以分享它。如果主管角色创建MessagePublisher actor,那么孩子们是否可以找到将消息发送给它的人?

谢谢

回答

0

根据不同的使用情况下,你可以在顶层或作为一个孩子Actor向你的主管创建共享Actor。 然后,您只需通过ActorRef将消息或构造函数传递给主管/子演员,并将其保留为Actor内部状态。

下面的代码应该说明它(它是Scala,但它应该很容易翻译成Java)。

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) 

}