Я новичок в 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 (), но ему также приходится ждать, пока предыдущий пользователь завершит задачу. Итак, как избежать такого рода проблем. Спасибо.