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