我正在尝试实现一个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()
}