我正在使用 akka 集群以在两个阶段执行分布式计算。先phaseA
然后 phaseB
.为了处理阶段,我使用 akka 的 FSM。
没有硬同步,因此其中一个节点可能会到达 phaseB
而其他人仍在phaseA
.
问题是,phaseB
中的一个发送 phaseB-related
给其他人的消息(他们还在 phaseA
中) 是什么导致他们松动 phaseB-related
消息。
现在我使用简单的技巧来推迟未知消息:
case any => self ! any
但是 IMO 这不是正确的方法。我知道我也可以安排
any
使用 akka 调度程序,但我也不喜欢这个。这是简化的代码:
package whatever
import akka.actor._
object Test extends App {
case object PhaseA
case object PhaseB
class Any extends Actor {
def phaseA: Receive = {
case PhaseA => {
context.become(phaseB)
println("in phaseB now")
}
case any => self ! any
}
def phaseB: Receive = {
case PhaseB => println("got phaseB message !")
}
def receive = phaseA
}
val system = ActorSystem("MySystem")
val any = system.actorOf(Props(new Any), name = "any")
any ! PhaseB
any ! PhaseA
}
在这种情况下推迟消息的正确方法是什么?
最佳答案
您可以存储消息以供以后处理。混音 akka.actor.Stash
进入你的 Actor 和stash()
您的 phaseB
以后的消息。
当你的 FSM 在 phaseA
并收到 phaseB
留言,调用stash()
.当那个 Actor 然后过渡到phaseB
状态,请调用 unstashAll()
并且所有隐藏的消息都将被重新传递。
关于scala - 在 Akka 中推迟消息的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28005231/