【发布时间】:2015-07-01 21:21:33
【问题描述】:
我有以下封装我的 Akka 程序的驱动程序/主类:
// Groovy pseudo-code
class FizzBuzz {
ActorSystem actorSystem
static void main(String[] args) {
FizzBuzz d = new FizzBuzz()
d.run()
}
void run() {
Initialize initCmd = new Initialize()
MasterActor master = actorSystem.get(...)
// Tells the entire actor system to initialize itself and start doing stuff.
// ChickenCluckDetector is an actor managed/supervised by MasterActor.
master.tell(initCmd, ...)
}
// Called when a ChickenCluckDetector actor inside the actor system receives
// a 'Cluck' message.
void onChickenGoesCluck(Cluck cluck) {
// Do something
}
}
还有以下ChickenCluckDetector演员:
class ChickenCluckDetector extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof Cluck) {
Cluck cluck = message as Cluck
// Now, how to pass the message safely/properly to FizzBuzz#onCluck?
}
}
}
所以手头的问题是如何安全/正确地将Cluck 消息传递给FizzBuzz#onCluck(Cluck),它位于actor 系统之外? 我可以像这样提供FizzBuzz对ChickenCluckDetector的引用:
class ChickenCluckDetector extends UntypedActor {
FizzBuzz fizzBuzz
@Override
void onReceive(Object message) {
if(message instanceof Cluck) {
Cluck cluck = message as Cluck
fizzBuzz.onCluck(cluck)
}
}
}
但我觉得这违反了 Akka 的最佳实践,可能会导致各种基于并发的问题,特别是如果只有一个 FizzBuzz(有)非参与者/驱动程序,以及一万个 ChickenCluckDetector 参与者.想法?
【问题讨论】: