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

时间:2015-01-17 22:55:16

标签: scala akka

我使用akka群集以便在两个pahses中执行分布式计算。首先phaseA然后phaseB。为了处理阶段,我使用了akka的FSM。

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

问题是,phaseB中的一个人向其他人发送了phaseB-related条消息(它们还在phaseA中),导致他们丢失phaseB-related条消息。

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

case any => self ! any

但IMO这不是正确的做法。我知道我也可以使用akka调度程序安排any,但我也不喜欢这样。

以下是简化代码:

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
}

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

1 个答案:

答案 0 :(得分:12)

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

当您的FSM位于phaseA并收到phaseB消息时,请致电stash()。当该actor然后转换到phaseB状态时,调用unstashAll()并重新传递所有隐藏的消息。