0
我希望可以问这个问题。我正在使用阿卡,并且有两个演员,其中一个快速启动/创建,另一个慢得多。快速创建的人向另一个人请求(ask-pattern),并且该消息被发送到死信,因为另一个尚未启动。让演员等待发送消息的首选方式是什么?如果不知道没有别的办法,我并不急于让演员睡觉或是什么。如何避免发送消息给未创建的演员?
我希望可以问这个问题。我正在使用阿卡,并且有两个演员,其中一个快速启动/创建,另一个慢得多。快速创建的人向另一个人请求(ask-pattern),并且该消息被发送到死信,因为另一个尚未启动。让演员等待发送消息的首选方式是什么?如果不知道没有别的办法,我并不急于让演员睡觉或是什么。如何避免发送消息给未创建的演员?
我会使用功能become()/unbecome()
Akka为演员提供。我在下面的代码中假设slowActor
由fastActor
创建。这里的技巧是,fastActor
将有两种行为:一种是当slowActor
正在启动时,另一种是当它准备好做一些工作时。当slowActor
准备就绪后,它会发送一条消息给fastActor
来宣传可以接收消息。 fastActor
将watch
ing slowActor
,如果它终止,它会再次改变它的行为。接下来做什么将取决于您的解决方案。
这是一个模拟的代码作为指导(我还没有编译的代码,它可能含有一些错误):
case object Ready
case object DoWork
case object WorkDone
class FastActor extends Actor with ActorLogging {
val slowActor = context.actorOf(SlowActor.props)
context.watch(slowActor)
def receive = slowActorNotReadyBehavior
def slowActorNotReadyBehavior = {
case DoWork => log.warning("Slow actor in not ready, I am sorry...")
case Ready => context.become(slowActorReadyBehavior)
}
def slowActorReadyBehavior = {
case DoWork => (slowActor ? DoWork).pipeTo(self)
case Terminated(ref) =>
log.error("Slow actor terminated")
context.unbecome()
//... do something with slowActor
}
}
class SlowActor extends Actor {
override def preStart = {
context.parent ! Ready
}
def receive = {
case DoWork =>
//do something
sender ! WorkDone
}
}
感谢。这可能很有趣,但是慢镜头是迄今为止快速演员的兄弟。 – stian