我正在使用akka集群,以便在两个pahses中执行分布式计算.第一phaseA则phaseB.为了处理阶段,我使用了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 和所有被隐藏的消息.
| 归档时间: |
|
| 查看次数: |
700 次 |
| 最近记录: |