如何在 Akka 演员接收的特定情况下接收消息?

How to receive a message within a specific case of a receive in Akka actors?

我正在尝试实现一个 Akka actor,它接收一条消息然后等待接收另一条消息而不循环。我试图以这种方式实现它的原因是因为我需要在第二个 case 语句中的第一个 case 语句中接收到的对象。下面是我的意思的一个例子。

def receive: Receive = {
    case s @ start =>
      receive {
        case e @ end =>
          println(f"Received ${s} and ${e}")
      }
  }

我知道这可能不是理想的模式。但是,我对 Akka 和 Scala 还是个新手,不知道还有什么其他的方法可以实现它。欢迎所有建议。

这是实现此目标的好方法:

创建仅等待第二条消息的第二个接收方法。使用 context.become 将此方法设置为第一条消息到达时的接收函数。 s 值可以作为此方法的参数。

第二条消息到达时,由新的接收方法处理。一旦消息被处理,使用 context.become 恢复原来的 receive 方法。

您可以使用 Stash 支持 stash 当第二个接收方法处于活动状态时收到的任何其他消息。当意外消息到达时,stash 消息。处理完正确的消息并恢复原始接收处理程序后,调用 unstashAll 将它们放回队列中。这些消息将按原先的顺序重新发送给 actor,以供主要 receive 方法处理。

它可能看起来像这样:

def receive: Receive = {
  case s @ start =>
    context.become(endReceive(s))
  // Other cases
}

def endReceive(s: ???): Receive = {
  case e @ end =>
    println(f"Received ${s} and ${e}")
    context.become(receive)
    unstashAll()
  case _ =>
    stash()
}