文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
7.7 消息收件箱 Inbox
我们已经知道,所有Actor之间的通信都是通过消息来进行的。这是否意味着我们必须构建一个Actor来控制整个系统呢?答案是否定的,我们并不一定要这么做,Akka框架已经为我们准备了一个叫做“收件箱”的组件,使用收件箱,可以很方便地对Actor进行消息发送和接收,大大方便了应用程序与Actor之间的交互。
下面定义了当前示例中唯一一个Actor:
01 public class MyWorker extends UntypedActor { 02 private final LoggingAdapter log = Logging.getLogger(getContext().system(), this); 03 public static enum Msg { 04 WORKING, DONE,CLOSE; 05 } 06 07 @Override 08 public void onReceive(Object msg) { 09 if (msg == Msg.WORKING) { 10 log.info("I am working"); 11 } 12 if (msg == Msg.DONE) { 13 log.info("Stop working"); 14 }if (msg == Msg.CLOSE) { 15 log.info("I will shutdown"); 16 getSender().tell(Msg.CLOSE, getSelf()); 17 getContext().stop(getSelf()); 18 } else 19 unhandled(msg); 20 } 21 }
上述代码中,MyWorker会根据收到的消息打印自己的工作状态。当接收到CLOSE消息时(第14行),会关闭自己,结束运行。
而在本例中,与这个MyWorker Actor交互的,并不是一个Actor,而是一个邮箱,邮箱的使用很简单:
01 public static void main(String[] args) { 02 ActorSystem system = ActorSystem.create("inboxdemo", ConfigFactory.load("samplehello.conf")); 03 ActorRef worker = system.actorOf(Props.create(MyWorker.class), "worker"); 04 05 final Inbox inbox = Inbox.create(system); 06 inbox.watch(worker); 07 inbox.send(worker, MyWorker.Msg.WORKING); 08 inbox.send(worker, MyWorker.Msg.DONE); 09 inbox.send(worker, MyWorker.Msg.CLOSE); 10 11 while(true){ 12 Object msg = inbox.receive(Duration.create(1, TimeUnit.SECONDS)); 13 if(msg==MyWorker.Msg.CLOSE){ 14 System.out.println("My worker is Closing"); 15 }else if(msg instanceof Terminated){ 16 System.out.println("My worker is dead"); 17 system.shutdown(); 18 break; 19 }else{ 20 System.out.println(msg); 21 } 22 } 23 }
上述代码中,第5行,根据ActorSystem构造了一个与之绑定的邮箱Inbox。接着使用邮箱监视MyWorker(第6行),这样就能在MyWorker停止后得到一个消息通知。第7~9行,通过邮箱向MyWorker发送消息。
在第11~21行,进行消息接收,如果发现MyWorker已经停止工作,则关闭整个ActorSystem(第17行)。
执行上述代码,输出如下(为节省版面,我对输出进行了一些简单的删减):
[INFO] [inboxdemo-akka.actor.default-dispatcher-3] [akka://inboxdemo/user/worker] I am working [INFO] [inboxdemo-akka.actor.default-dispatcher-3] [akka://inboxdemo/user/worker] Stop working [INFO] [inboxdemo-akka.actor.default-dispatcher-3] [akka://inboxdemo/user/worker] I will shutdown My worker is Closing My worker is dead
上述输出的前3行为MyWorker的输出日志,表示MyWorker Actor的工作状态。后两行为主函数main()中对MyWorker消息的处理。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论