我是Vert.x的新手。我关注了Vert.x文档和一些教程。但是我很困惑使用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);
});
这是&#34; todoService&#34;: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上运行。所有http请求都将进入同一个线程。 TodoServiceVerticle 正在另一个线程中运行。< / p>
现在我的问题是如果 TodoServiceVerticle.onMessage()函数包含耗时的任务(例如: - 数据库操作,读取大文件,......),它将阻止进程。假设进入同时另一个用户调用TodoServiceVerticle.onMessage(),但他也必须等到上一个用户完成任务。所以如何避免这种问题。谢谢。
答案 0 :(得分:3)
请看这个博客系列: