第 2 部分: 创建第一个 Actor

依赖

在你的项目中添加如下依赖:

  1. <!-- Maven -->
  2. <dependency>
  3. <groupId>com.typesafe.akka</groupId>
  4. <artifactId>akka-actor_2.11</artifactId>
  5. <version>2.5.19</version>
  6. </dependency>
  7. <!-- Gradle -->
  8. dependencies {
  9. compile group: 'com.typesafe.akka', name: 'akka-actor_2.11', version: '2.5.19'
  10. }
  11. <!-- sbt -->
  12. libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.5.19"

简介

随着对 Actor 层次结构和行为的理解,剩下的问题是如何将物联网(IoT)系统的顶级组件映射到 Actor。让代表设备和仪表盘的 Actor 处于顶层是很有吸引力的。相反,我们建议创建一个表示整个应用程序的显式组件。换句话说,我们的物联网系统中只有一个顶级的 Actor。创建的管理设备和仪表板的组件将是此 Actor 的子 Actor。这允许我们将示例用例的体系结构图重构为 Actor 树:

actor-tree

我们可以用几行简单的代码定义第一个 Actor,即IotSupervisor。为了开始你的教程应用程序:

  • 在适当的包路径下创建新的IotSupervisor源文件,例如在com.example包中;
  • 将以下代码粘贴到新文件中以定义IotSupervisor
  1. package com.example;
  2. import akka.actor.AbstractActor;
  3. import akka.actor.ActorLogging;
  4. import akka.actor.Props;
  5. import akka.event.Logging;
  6. import akka.event.LoggingAdapter;
  7. public class IotSupervisor extends AbstractActor {
  8. private final LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);
  9. public static Props props() {
  10. return Props.create(IotSupervisor.class, IotSupervisor::new);
  11. }
  12. @Override
  13. public void preStart() {
  14. log.info("IoT Application started");
  15. }
  16. @Override
  17. public void postStop() {
  18. log.info("IoT Application stopped");
  19. }
  20. // No need to handle any messages
  21. @Override
  22. public Receive createReceive() {
  23. return receiveBuilder()
  24. .build();
  25. }
  26. }

代码类似于我们在前面的实验中使用的 Actor 示例,但请注意:

  • 我们使用的不是println(),而是akka.event.Logging,它直接调用了 Akka 的内置日志功能。
  • 我们使用推荐的模式来创建 Actor,即通过在 Actor 内部定义props()静态方法来创建 Actor。

要提供创建 Actor 系统的主入口点,请将以下代码添加到新的IotMain类中。

  1. package com.example;
  2. import java.io.IOException;
  3. import akka.actor.ActorSystem;
  4. import akka.actor.ActorRef;
  5. public class IotMain {
  6. public static void main(String[] args) throws IOException {
  7. ActorSystem system = ActorSystem.create("iot-system");
  8. try {
  9. // Create top level supervisor
  10. ActorRef supervisor = system.actorOf(IotSupervisor.props(), "iot-supervisor");
  11. System.out.println("Press ENTER to exit the system");
  12. System.in.read();
  13. } finally {
  14. system.terminate();
  15. }
  16. }
  17. }

这个应用程序除了打印它的启动信息之外,几乎没有任何作用。但是,我们已经完成了第一个 Actor 的创建工作,并且准备好添加其他 Actor 了。

下一步是什么?

在下面的章节中,我们将通过以下方式逐步扩展应用程序:

  • 创建设备的表示。
  • 创建设备管理组件。
  • 向设备组添加查询功能。

英文原文链接Part 2: Creating the First Actor.