加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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()并重新传递所有存储的消息.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读