0
我有一个AKKA模型,有一个主管演员创建许多儿童演员。小孩演员会处理一个事件并将消息发送到另一个服务(例如Kafka话题)。与其他演员共享演员
目前我有一个静态共享类,在儿童演员之间共享发送消息,但在演员模型中,我认为最好使用演员来达到此目的。
我想知道如何创建一个演员,让小孩演员可以分享它。如果主管角色创建MessagePublisher actor,那么孩子们是否可以找到将消息发送给它的人?
谢谢
我有一个AKKA模型,有一个主管演员创建许多儿童演员。小孩演员会处理一个事件并将消息发送到另一个服务(例如Kafka话题)。与其他演员共享演员
目前我有一个静态共享类,在儿童演员之间共享发送消息,但在演员模型中,我认为最好使用演员来达到此目的。
我想知道如何创建一个演员,让小孩演员可以分享它。如果主管角色创建MessagePublisher actor,那么孩子们是否可以找到将消息发送给它的人?
谢谢
根据不同的使用情况下,你可以在顶层或作为一个孩子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)
}