我正在尝试实现一个Akka actor,它接收一条消息,然后等待接收另一条消息而不会循环。之所以尝试以这种方式实现它,是因为我需要第二个case语句中的第一个case语句中接收到的对象。以下是我的意思的示例。
def receive: Receive = {
case s @ start =>
receive {
case e @ end =>
println(f"Received ${s} and ${e}")
}
}
我知道这可能不是理想的模式。但是,我仍然对Akka和Scala还是陌生的,并且不知道有任何其他方法可以实现此目的。欢迎提出所有建议。
答案 0 :(得分:3)
这是实现此目标的好方法:
创建另一个等待第二条消息的接收方法。当第一条消息到达时,使用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()
}