如何使用Vert.x实现非阻塞REST Web服务

时间:2016-03-10 16:26:49

标签: rest nonblocking vert.x

我是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(),但他也必须等到上一个用户完成任务。所以如何避免这种问题。谢谢。

1 个答案:

答案 0 :(得分:3)

请看这个博客系列:

  • first post描述了如何使用Maven构建vert.x应用程序并执行单元测试。
  • second post描述了此应用程序如何变为可配置。
  • third post引入了vertx-web,并开发了一个小型集合管理应用程序。此应用程序提供HTML / JavaScript前端使用的REST API。
  • fourth post介绍了如何运行集成测试以确保应用程序的行为。
  • fifth post介绍了如何使用vertx-jdbc-client与JDBC数据库进行交互。
  • 目前的最后一篇文章介绍了如何与MongoDB进行交互。