如何处理要按特定顺序执行和完成的actor之间的消息?
换句话说,如果例如Message A
想要在Message B
之前收到,那么如何使用akka来完成?
答案 0 :(得分:0)
我在这里假设你的意思是你需要一个“消息A”才能处理“消息B”。其他替代方案是:
所以,放弃这些其他选项,这是一种技术。首先,在期望消息A和期望消息B时为状态定义单独的接收方法:
def receivingA = Receive {
case MessageA(x) => ...
}
def receivingB = Receive {
case MessageB(y) => ...
}
您可以将第一个设置为默认值:
def receive = receivingA
接收消息A时,您可以将状态更改为预期消息B:
case MessageA(x) =>
// do stuff
become(receivingB)
在消息B上你可以回到第一个案例,但我会跳过它。
现在唯一缺少的是你将要做的事情,而不是预期到达的消息。你什么也做不了,它会将它们发送到错误日志,或者你可以通过覆盖这个方法来做一些事情:
def unhandled(msg: Any): Unit = message match {
case Terminated(target) => ...
case msg => ...
}
默认行为将未处理的消息作为UnhandledMessage
类型的对象发布到系统事件流,因此您也可以通过这种方式获取它们,尽管这只会将它们重新插入到不同类型的队列中。最后,您可能无法接收消息B并将其排队,然后在收到消息A后重新发送消息。