如何使用 Vert.x 实现非阻塞 REST Web 服务
How to implement non blocking REST web service using Vert.x
我是 Vert.x 的新手。我遵循了 Vert.x 文档和一些 tutorials.But 我搞不清楚什么是使用 Vert.x 实现非阻塞 REST Web 服务的正确方法。我找到了这篇文章 Develop Non-Blocking Web Applications in Java,其中包含一个使用 Vert.x.
实现非阻塞 Web 应用程序的示例
此代码块包含向另一个 Vertical("todoService":TodoServiceVerticle).
发送消息
JsonObject command = new JsonObject();
command.putString("action","findOne").
putNumber("id",Long.valueOf(request.params().get("id")));
String address = "todoService";
vertx.eventBus().send(address, command, (Message<JsonObject> message)-> {
JsonObject item = message.body();
String payload = item.encode();
request.response()
.putHeader("content-type", "application/json")
.end(item);
});
这是 "todoService":TodoServiceVerticle 垂直。
public class TodoServiceVerticle extends Verticle{
/** Initializes the verticle at the start-up */
@Override public void start() {
// Initialize the verticle
vertx.eventBus().registerHandler("todoService", this::onMessage);
}
private void onMessage(Message<JsonObject> message) {
JsonObject command = message.body();
// Only "findOne" is supported in this example
assert ("findOne".equals(command.getString("action")));
Long id = command.getLong("id");
Todo item = findOneById(id);
JsonObject payload = toJson(item);
message.reply(payload);
}
}
在此示例中,服务器 运行 在一个 Thread.All 上,http 请求相同 thread.The TodoServiceVerticle 在不同的线程中 运行。
现在我的问题是,如果 TodoServiceVerticle.onMessage() 函数包含耗时任务(例如:- 数据库操作、读取大文件...),它将在另一个用户调用 TodoServiceVerticle.onMessage() 的同时阻止 process.Assume 但他还必须等到前一个用户完成 task.So 如何避免这种 problem.Thanks。
请看这个博客系列:
- first post 描述了如何使用 Maven 构建 vert.x 应用程序并执行单元测试。
- second post 描述了该应用程序如何变得可配置。
- third post 引入了 vertx-web,并且开发了一个小型 collection 管理应用程序。此应用程序提供了 HTML/JavaScript 前端使用的 REST API。
- fourth post 介绍了如何 运行 集成测试来确保应用程序的行为。
- fifth post 介绍了如何使用 vertx-jdbc-client.
与 JDBC 数据库进行交互
- 最近的 post 介绍了如何与 MongoDB 互动。
我是 Vert.x 的新手。我遵循了 Vert.x 文档和一些 tutorials.But 我搞不清楚什么是使用 Vert.x 实现非阻塞 REST Web 服务的正确方法。我找到了这篇文章 Develop Non-Blocking Web Applications in Java,其中包含一个使用 Vert.x.
实现非阻塞 Web 应用程序的示例此代码块包含向另一个 Vertical("todoService":TodoServiceVerticle).
发送消息JsonObject command = new JsonObject();
command.putString("action","findOne").
putNumber("id",Long.valueOf(request.params().get("id")));
String address = "todoService";
vertx.eventBus().send(address, command, (Message<JsonObject> message)-> {
JsonObject item = message.body();
String payload = item.encode();
request.response()
.putHeader("content-type", "application/json")
.end(item);
});
这是 "todoService":TodoServiceVerticle 垂直。
public class TodoServiceVerticle extends Verticle{
/** Initializes the verticle at the start-up */
@Override public void start() {
// Initialize the verticle
vertx.eventBus().registerHandler("todoService", this::onMessage);
}
private void onMessage(Message<JsonObject> message) {
JsonObject command = message.body();
// Only "findOne" is supported in this example
assert ("findOne".equals(command.getString("action")));
Long id = command.getLong("id");
Todo item = findOneById(id);
JsonObject payload = toJson(item);
message.reply(payload);
}
}
在此示例中,服务器 运行 在一个 Thread.All 上,http 请求相同 thread.The TodoServiceVerticle 在不同的线程中 运行。
现在我的问题是,如果 TodoServiceVerticle.onMessage() 函数包含耗时任务(例如:- 数据库操作、读取大文件...),它将在另一个用户调用 TodoServiceVerticle.onMessage() 的同时阻止 process.Assume 但他还必须等到前一个用户完成 task.So 如何避免这种 problem.Thanks。
请看这个博客系列:
- first post 描述了如何使用 Maven 构建 vert.x 应用程序并执行单元测试。
- second post 描述了该应用程序如何变得可配置。
- third post 引入了 vertx-web,并且开发了一个小型 collection 管理应用程序。此应用程序提供了 HTML/JavaScript 前端使用的 REST API。
- fourth post 介绍了如何 运行 集成测试来确保应用程序的行为。
- fifth post 介绍了如何使用 vertx-jdbc-client. 与 JDBC 数据库进行交互
- 最近的 post 介绍了如何与 MongoDB 互动。