scala – 在Akka中推迟消息的正确方法
发布时间:2020-12-16 19:08:59 所属栏目:安全 来源:网络整理
导读:我正在使用akka集群,以便在两个pahses中执行分布式计算.第一阶段A然后阶段B.为了处理阶段,我使用了akka的FSM. 没有硬同步,因此其中一个节点可能到达phaseB而其他节点仍然处于phaseA. 问题是,阶段B中的一个将与phaseB相关的消息发送给其他人(他们还处于阶段A)
我正在使用akka集群,以便在两个pahses中执行分布式计算.第一阶段A然后阶段B.为了处理阶段,我使用了akka的FSM.
没有硬同步,因此其中一个节点可能到达phaseB而其他节点仍然处于phaseA. 问题是,阶段B中的一个将与phaseB相关的消息发送给其他人(他们还处于阶段A),这导致他们丢失与phaseB相关的消息. 现在我使用简单的技巧推迟未知消息: case any => self ! any 但IMO并不是这样做的正确方法.我知道我也可以安排任何使用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中并存储()您的phaseB消息以供日后使用.
当您的FSM处于phaseA并收到phaseB消息时,请调用stash().当该actor然后转换到phaseB状态时,调用unstashAll()并重新传递所有存储的消息. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |