Actor消息的同步

时间:2013-12-19 00:31:33

标签: scala akka actor

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

换句话说,如果例如Message A想要在Message B之前收到,那么如何使用akka来完成?

1 个答案:

答案 0 :(得分:0)

我在这里假设你的意思是你需要一个“消息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后重新发送消息。