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

问题描述 投票:0回答:1

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

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

我知道这可能不是理想的模式。但是,我仍然对Akka和Scala还是陌生的,并且不知道有任何其他方法可以实现此目的。欢迎提出所有建议。

scala akka actor
1个回答
0
投票

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

[创建另一个等待第二条消息的接收方法。当第一条消息到达时,使用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()
}
© www.soinside.com 2019 - 2024. All rights reserved.