为了了解 Vert.x 核心 API,我们将使用我们在 第 4 章,将 Web 界面添加到 Quarkus 服务。您可以在本书的 GitHub 存储库中找到 Chapter09/core/customer-service 文件夹示例的源代码。我们建议您将项目导入 IDE。
现在,让我们直接进入代码。由于 Vert.x 核心 API 基于回调机制,为了利用异步和非阻塞 API,对于我们的客户服务示例,我们添加了两个函数,它们将从文件系统中读取和写入 JSON 格式的客户列表.我们应该在哪里写我们的客户名单?答案在 application.properties 文件中,该文件定义了一个名为 file.path 的属性,将写入客户列表:
现在,让我们看一下代码。负责提供客户数据的核心类是 CustomerRepository。此时我们将在那里注入一个 io.vertx.core.Vertx 的实例。我们还将注入存储数据的路径:
现在来了有趣的一点,即编写一个使用 vertx 实例的方法来展平文件系统上的客户列表:
您可能首先注意到的是 CompletionStage 方法的签名。如果您一直在编写异步 Java 代码,您可能熟悉 java.util.concurrent.Future API。它用于执行以下操作:
- Check whether the execution has completed via the isDone() method
- Cancel the execution using the cancel() method
- Fetch the result of the execution using the blocking get() method
这种方法的主要限制是调用者不能手动完成任务,也不能链接多个 Future 执行。
另一方面,CompletionStage 基于阶段的概念,被认为是多个中间计算,可能是异步的,也可能不是异步的。无论如何,我们必须在达到最终结果之前完成它们。这些中间计算称为完成阶段。
通过使用 CompletionStage 阶段,您可以通过执行以下操作轻松解决 java.util.concurrent.Future API 的限制:
- Manually completing CompletableStage using complete(T value)
- Chaining multiple CompletableStage in a block
让我们回到我们的例子。一旦我们从客户列表中创建了 JsonArray,我们就可以使用 Vert.x 核心 API 访问我们的 FileSystem。我们还可以注册一个处理程序,该处理程序负责在文件成功写入后立即完成我们的 CompletionStage。
我们看一下readFile方法,它负责读取包含客户列表的文件:
readFile 方法故意稍微复杂一些。事实上,我们已经将两个不同的阶段链接到其中。第一个执行一个一次性计时器,它将在 100 毫秒内触发下一次执行。计时器是 Vert.x 的核心构造,应该在您想要延迟执行某些代码或重复执行它的任何地方使用:
在任何情况下,计时器都是您可以在 Vert.x 术语中延迟执行的方式,以代替其他机制,例如 Thread.sleep,它会阻塞事件循环,因此应该从不< /strong>,永远在 Vert.x 上下文中使用。
If you forget our gentle warning, Vert.x will remind you each time you attempt to use a blocking code in the Vert.x context with a log message similar to
Thread vertx-eventloop-thread-1 has been blocked for 22258 ms.
readFile 方法的其余部分与 writeFile 方法完全相反;也就是说,它读取 JSON 文件并在文件被读取后立即完成该阶段。
为了向客户端应用程序公开此功能,我们向 CustomerEndpoint 类添加了两个包装器方法,以便通过 REST API 公开这些功能:
值得注意的是,writeFile 方法会生成文本信息,因为它应该向调用者返回一个简单的文本消息。另一方面,readFile 方法依赖于类的默认 application/json 格式来显示 JSON 文本文件。
现在,让我们转到客户端。我们可以使用另外两个 AngularJS 处理程序轻松捕获 CompletionStage 事件,这将在结果可用时立即捕获:
这两个功能都将通过在我们的主页上添加两个简单的按钮来触发:
除了这样做之外,我们还在 HTML 模式中添加了一个 div 部分,该部分将显示信息:
事不宜迟,让我们使用以下命令构建并运行应用程序:
以下是我们的新 UI,其中包括 Read File 和 Write File 按钮。我们刚刚保存了一组 Customer 对象,如下图所示:
相反,如果我们点击 Read File 按钮,其内容将以 JSON 格式显示在页面下方的 div 中:
我们已经完成了 Vert.x 核心的第一轮。现在,让我们继续看看将 Vert.x 与 ReactiveX (RxJava) 结合使用。