温馨提示:Akka 中文指南的 GitHub 地址为「」,欢迎大家、,纠错。
Akka 是一个用于在 JVM 上构建高并发、分布式和容错的事件驱动应用程序的运行时工具包。Akka 既可以用于 Java,也可以用于 Scala。本指南通过描述 Java 版本的示例来介绍 Akka。如果你喜欢将 Akka 与 Scala 结合使用,请切换到「」。
Actors 是 Akka 的执行单元。Actor 模型是一种抽象,它让编写正确的并发、并行和分布式系统更加容易。示例说明了 Akka 的基础知识。在 30 分钟内,你应该能够下载并运行示例,并使用本指南了解示例是如何构造的。这会让你初步了解 Akka 的魅力,希望这能够让你拥有深入了解 Akka 的兴趣()!
在体验过这个示例之后,想深入了解 Akka,阅读「」是一个很好的选择。
Java 版本的示例是一个包含 Maven 和 Gradle 构建文件的压缩项目。你可以在 Linux、MacOS 或 Windows 上运行它。唯一的先决条件是安装 Java 8 和 Maven 或 Gradle。
下载和解压示例:
确保你已经安装了构建工具,然后打开终端窗口,并从项目目录中键入以下命令以运行:
输出应该如下所示(一直向右滚动以查看 Actor 输出):
恭喜你,你刚刚运行了你的第一个 Akka 应用程序。
正如你在控制台输出中看到的,该示例输出了一些问候语。让我们看看运行时都发生了什么。
首先,主函数创建了一个,它是一个运行的容器。接下来,它创建了三个实例和一个实例。
然后,该示例将消息发送给实例,后者在内部存储消息。最后,发送给的指令消息触发它们向发送消息,将消息输出到控制台:
Akka 对 Actor 和异步消息传递的使用带来了一系列好处。大家可以考虑一下都带来了什么好处?
Akka 的以下特性使你能够以直观的方式解决困难的并发性和可伸缩性挑战:
让我们看看在示例中使用 Actor 和消息一起工作的一些**实践。
消息可以是任意类型(的任何子类型),你可以将装箱类型(如、、等)作为消息发送,也可以将普通数据结构(如数组和集合类型)作为消息发送。
的 Actor 使用三种不同的消息:
在定义 Actor 及其消息时,请记住以下建议:
让我们看看 Actor 如何实现和来演示这些**实践。
Greeter Actor
下面的代码段来自于,其实现了:
让我们来解析上面的功能:
Printer Actor
的实现非常简单:
到目前为止,我们已经研究了 Actor 的定义和他们的消息。现在,让我们更深入地了解位置透明()的好处,看看如何创建 Actor 实例。
位置透明的好处
在 Akka 中,不能使用关键字创建 Actor 的实例。相反,你应该使用工厂方法创建 Actor 实例。工厂不返回 Actor 实例,而是返回指向 Actor 实例的引用。在分布式系统中,这种间接创建实例的方法增加了很多好处和灵活性。
在 Akka 中位置无关紧要。位置透明性意味着,无论是在正在运行 Actor 的进程内,还是运行在远程计算机上,都可以保持相同语义。如果需要,运行时可以通过更改 Actor 的位置或整个应用程序拓扑来优化系统。这就启用了故障管理的“让它崩溃()”模型,在该模型中,系统可以通过销毁有问题的 Actor 和重新启动健康的 Actor 来自我修复。
Akka ActorSystem
工厂在某种程度上类似于 Spring 的 BeanFactory,它是运行 Actor 的容器并管理他们的生命周期。工厂方法创建 Actor 并接受两个参数,一个名为的配置对象和一个类型的 Actor 名称。
Actor 和 ActorSystem 的名字在 Akka 中很重要。例如,使用它们进行查找。使用与你的域模型()一致的有意义的名称可以更容易地对它们进行推理。
前面我们看了的 Actor 定义。现在,让我们看看文件中创建 Greeter Actor 和 Printer Actor 实例的代码:
注意以下事项:
注意:在本例中,Greeter Actor 都使用了相同的 Printer 实例,但我们可以创建多个 Printer Actor 实例。示例中使用一个实例来说明稍后我们将讨论的消息传递()的一个重要概念。
接下来,我们来看看如何与 Actor 通信。
Actor 是被动的和消息驱动的。Actor 在收到消息前什么都不做。Actor 使用异步消息进行通信。这样可以确保发送者不会一直等待接收者处理他们的消息。相反,发件人将邮件放在收件人的邮箱之后,就可以自由地进行其他工作。Actor 的邮箱本质上是一个具有排序语义的消息队列。从同一个 Actor 发送的多条消息的顺序被保留,但可以与另一个 Actor 发送的消息交错。
你可能想知道 Actor 在不处理消息的时候在做什么,比如,做什么实际的工作?实际上,它处于挂起状态,在这种状态下,它不消耗除内存之外的任何资源。同样,这也展示了 Actor 的轻量级和高效性。
给 Actor 发生消息
要将消息放入 Actor 的邮箱,我们需要使用的方法。例如,的主函数向 Greeter Actor 发送如下消息:
Greeter Actor 也向 Printer Actor 发送消息:
我们已经研究了如何创建 Actor 和发送消息。现在,让我们来回顾一下类的全部内容。
的 类创建和控制 Actor。注意,使用作为容器,并使用方法创建 Actor。最后,类创建要发送给 Actor 的消息。
类似地,让我们再次看看定义 Actor 和他们接受的消息的完整源代码。
下面是创建示例应用程序的三个类、和的完整源代码:
Greater.java
Printer.java
AkkaQuickstart.java
作为另一个**实践,我们应该提供一些单元测试。
示例中的测试展示了 JUnit 框架的使用。虽然测试的覆盖范围不完整,但它简单地展示了测试 Actor 代码是多么的容易,并提供了一些基本概念。你可以把它作为一个练习来增加你自己的知识。
测试类使用的是,它是用于 Actor 和 Actor 系统集成测试的模块。这个类只使用了提供的一部分功能。
集成测试可以帮助我们确保 Actor 的行为是异步的。第一个测试使用探针来询问和验证预期的行为。让我们看看源代码片段:
一旦我们引用了探针,我们就将它的作为构造函数参数的一部分传递给。然后,我们向发送两条信息:一条是设置问候语,另一条是触发的发送。的方法验证是否发送了消息。
示例代码只涉及了功能的一小部分,在「」可以找到更完整的概述。
现在我们已经检查了所有代码。让我们再次运行该示例并查看其输出。
你可以通过命令行或者 IDE 来运行应用程序。在本指南的最后一个主题,我们描述了如何在 IntelliJ IDEA 中运行该示例。但是,在我们再次运行应用程序之前,让我们先快速的查看构建文件。
运行项目
和前面一样,从控制台运行应用程序:
输出应该如下所示(一直向右滚动以查看 Actor 输出):
还记得我们设置 Printer Actor 使用 Akka 的 Logger 吗?这就是为什么我们记录东西时会有很多额外的信息。日志输出包含诸如何时和从哪个 Actor 记录日志之类的信息。现在,让我们将重点放在 Printer Actor 的输出上:
这是我们的代码向 Greeter Actor 发送消息的结果:
为了执行单元测试,我们输入命令:
尝试多次运行代码,并观察日志的顺序,你注意到它们的输入顺序发生变化了吗?这里发生了什么?异步行为变得很明显。这可能是你的一个新思维模式。但是,一旦你获得了使用它的经验,一切都会变得清晰;就像「」一样。
下一步
如果你使用 IntelliJ,请尝试将示例项目与 IntelliJ IDEA 集成。
想要继续了解更多有关 Akka 和 Actor Systems 的信息,请参阅「」,欢迎你加入我们!
JetBrains 的 IntelliJ 是 Java/Scala 社区中领先的 IDE 之一,它对 Akka 有着极好的支持。本节将指导你完成示例项目的设置、测试和运行。
设置项目
设置项目很简单。打开 IntelliJ 并选择并指向你安装示例项目的目录。
检查项目代码
如果我们打开文件,我们将看到许多行以开头,作为文档的注释。为了从源代码中去掉这些行,我们可以在 IntelliJ 中使用出色的查找/替换功能。选择,选中框并添加正则表达式,然后单击查找窗口中的。选择想要替换的内容,并对所有文件重复此操作。
测试和运行
对于测试,我们只需右键单击文件,然后选择。
类似地运行应用程序,我们右击文件,并选择。
有关更多详细信息,请参阅「运行应用程序」部分。
想要进一步了解 IntelliJ IDEA,可以参阅「」系列文章。
英文原文链接:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/7934.html