繁体   English   中英

Actor消息的同步

[英]Synchronization of Actor messages

如何处理要按特定顺序执行和完成的角色之间的消息?

换句话说,例如,如果Message A要被前总是收到Message B ,用阿卡它可以怎么做?

我在这里假设您的意思是您需要先获得“消息A”,然后才能处理“消息B”。 其他替代方法是:

  • 如果队列同时包含两个消息,则希望在“消息B”之前接收任何“消息A”。
  • 如果要按“消息B”的顺序发送“消息A”,则希望在该消息之前对其进行处理-这是它已经从同一发件人发送的方式,如果发件人不同,则不能执行此操作。

因此,放弃了这些其他选项之后,这是一种技术。 首先,为需要消息A和消息B的状态定义单独的接收方法:

def receivingA = Receive {
  case MessageA(x) => ...
}

def receivingB = Receive {
  case MessageB(y) => ...
}

您可以将第一个设置为默认值:

def receive = receivingA

收到消息A时,可以更改状态以期望消息B:

case MessageA(x) =>
  // do stuff
  become(receivingB)

在消息B上,您可以返回第一种情况,但是我将跳过。

现在唯一缺少的是您将如何处理意外收到的消息。 您什么也不能做,这会将它们发送到错误日志,或者可以通过重写此方法来做一些事情:

def unhandled(msg: Any): Unit = message match {
  case Terminated(target) => ...
  case msg => ...
}

默认行为将未处理的消息作为UnhandledMessage类型的对象发布到系统事件流,因此您也可以通过这种方式获取它们,尽管这只会将它们重新插入其他类型的队列中。 最后,您可能会乱序接收消息B并将其排队,然后在收到消息A后重新发送它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM