【发布时间】:2014-07-11 23:36:54
【问题描述】:
问题:
在 Akka Actor 中累积状态的正确模式是什么?
上下文:
假设我有一些服务都返回数据。
class ServiceA extends Actor {
def receive = {
case _ => sender ! AResponse(100)
}
}
class ServiceB extends Actor {
def receive = {
case _ => sender ! BResponse("n")
}
}
// ...
我希望有一个控制/监督参与者协调与所有这些服务的对话并跟踪它们的响应,然后将包含所有数据的响应发送回原始发送者。
class Supervisor extends Actor {
def receive = {
case "begin" => begin
case AResponse(id) => ???
case BResponse(letter) => ???
}
// end goal:
def gotEverything(id: Int, letter: String) =
originalSender ! (id, letter)
def begin = {
ServiceA ! "a"
ServiceB ! "b"
}
}
随着服务响应的到来,我如何将所有这些状态关联在一起?据我了解,如果我要将 AResponse 的值分配给 var aResponse: Int,则该 var 会随着接收到不同的消息而不断变化,我无法指望 var 在等待时保持不变对于BResponse 消息。
我意识到我可以使用 ask 和嵌套/flatMap Future,但从我读到的内容来看,这是一个糟糕的模式。有没有办法在没有 Future 的情况下实现这一切?
【问题讨论】:
-
为什么
aResponse会多次更改?您只向ServiceA发送一条消息。你的目标到底是什么?等到您收到AResponse和BResponse并用它们的值调用gotEverything? -
>> 你的目标到底是什么?等到您收到 AResponse 和 BResponse 并使用它们的值调用 gotEverything?是的
-
您可以将响应存储在带有一些标识符或演员参考的列表中