返回介绍

7.7 消息收件箱 Inbox

发布于 2024-08-21 22:20:21 字数 2422 浏览 0 评论 0 收藏 0

我们已经知道,所有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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文