Как реализовать неблокирующую веб-службу REST с помощью Vert.x

Я новичок в Vert.x. Я следил за документами Vert.x и некоторыми руководствами, но не понял, как правильно реализовать неблокирующую веб-службу REST с помощью Vert.x. Я нашел эту статью Разработка неблокирующих веб-приложений на Java, и в ней содержится пример реализации Неблокирующие веб-приложения, использующие Vert.x.

Этот блок кода содержит отправку сообщения в другую Вертикаль ("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);
    }
}

в этом примере сервер работает в одном потоке. Все HTTP-запросы поступают в один поток. TodoServiceVerticle выполняется в другом потоке.

Теперь моя проблема в том, что если функция TodoServiceVerticle.onMessage () содержит трудоемкую задачу (например: - Работа с БД, чтение большого файла, ...), она заблокирует процесс. Предположим в то же время. другой пользователь вызывает TodoServiceVerticle.onMessage (), но ему также приходится ждать, пока предыдущий пользователь завершит задачу. Итак, как избежать такого рода проблем. Спасибо.


person Tharanga    schedule 10.03.2016    source источник


Ответы (1)


Пожалуйста, посмотрите эту серию блогов:

  • В первом сообщении описано, как создать vert.x приложение с Maven и выполнить модульные тесты.
  • Во втором сообщении описано, как это приложение можно настроить.
  • В третьем посте были представлены vertx-web и небольшая коллекция управления приложение было разработано. Это приложение предлагает REST API, используемый веб-интерфейсом HTML / JavaScript.
  • В четвертом сообщении было рассказано, как можно запускать интеграционные тесты для проверки поведения ваше приложение.
  • В пятом посте было рассказано, как можно взаимодействовать с базой данных JDBC, используя клиент vertx-jdbc.
  • В текущем последнем посте было рассказано, как вы можете взаимодействовать с MongoDB.
person Paulo Lopes    schedule 11.03.2016