在Akka中推迟消息的正确方法

Sco*_*ony 6 scala akka

我正在使用akka集群,以便在两个pahses中执行分布式计算.第一phaseAphaseB.为了处理阶段,我使用了akka的FSM.

没有硬同步,因此其中一个节点可能会到达,phaseB而其他节点仍在phaseA.

问题是,一个人向他人phaseB发送phaseB-related消息(他们phaseA还在),导致phaseB-related消息松散的原因.

现在我使用简单的技巧推迟未知消息:

case any => self ! any
Run Code Online (Sandbox Code Playgroud)

但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
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下推迟邮件的正确方法是什么?

Rya*_*yan 12

您可以存储邮件以供以后处理.混合akka.actor.Stash到您的演员和stash()您的phaseB消息中以供日后使用.

当您的FSM进入phaseA并收到phaseB消息时,请致电stash().当该actor然后转换到phaseB状态时,unstashAll()将重新传递call 和所有被隐藏的消息.