java – Akka:在演员系统之外回传?
我有以下驱动程序/主类封装我的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消息传递给FizzBu??zz#onCluck(Cluck),它存在于actor系统之外?我可以提供一个关于ChickenCluckDetector的FizzBu??zz引用,如下所示: class ChickenCluckDetector extends UntypedActor { FizzBuzz fizzBuzz @Override void onReceive(Object message) { if(message instanceof Cluck) { Cluck cluck = message as Cluck fizzBuzz.onCluck(cluck) } } } 但我有一种感觉,这违反了Akka的最佳实践,可能导致各种基于并发的问题,特别是如果只有一个FizzBu??zz(有)非演员/驱动程序,以及一万个ChickenCluckDetector演员.想法? 解决方法
那么最好为所有这些ChickenCluckDetectors创建一个共同的父级.然后,这个父母可以安全地保存对FizzBu??zz的引用,从他所有的孩子那里收到cluck并调用onCluck方法. 在演员之外获取消息的一个选择是询问.在Scala中有演员DSL(仅为完整性添加).但我相信你的例子中不需要这些. public class ChickenCluckMaster extends UntypedActor { private FizzBuzz fizzBuzz; public ChickenCluckMaster(FizzBuzz fizzBuzz) { this.fizzBuzz = fizzBuzz; } public void onReceive(Object message) throws Exception { if (message instanceOf CreateDetector) { getContext().actorOf( Props.create(ChickenCluckDetector.class,getSelf); // Create child } else if (message instanceof Cluck) { fizzBuzz.onCluck(cluck); } else { unhandled(message); } } } public class ChickenCluckDetector extends UntypedActor { private ActorRef master; public ChickenCluckDetector(ActorRef master) { this.master = master; } public void onReceive(Object message) throws Exception { if (message instanceof Cluck) { Cluck cluck = (Cluck) message; master.tell(cluck,getSelf); } else { unhandled(message); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |