Способ, которым вы вызываете Thread.sleep()
, отправит ваш текущий поток JVM в спящий режим, эффективно блокируя текущее событие vert.x l oop, которое выполняется в том же потоке. Это не идиоматический c способ в vert.x выполнить код блокировки.
Смотрите здесь: " Золотое правило - не блокируйте событие l oop".
Если вам нужно запустить код блокировки, например Thread.sleep()
, вы должны реализовать этот код, используя рабочий вертикал . Рабочие версии используют потоки JVM из другого пула потоков и, следовательно, не блокируют событие l oop.
Первый пример кода, который вы опубликовали выше, не использует код блокировки, как вы правильно описали. Он использует идиоматический способ c с асинхронными неблокирующими обработчиками событий.
EDIT
См. Этот короткий пример того, как запустить очень простую рабочую фразу.
Код из класса WorkerVerticle
никогда не заблокирует событие l oop. Вы делаете его рабочим во время развертывания вертикали, устанавливая правильный параметр, как показано в DeployerVerticle
.
public class DeployerVerticle extends AbstractVerticle {
@Override
public void start() throws Exception {
System.out.println("Main verticle has started, let's deploy another...");
// Deploy it as a worker verticle
vertx.deployVerticle("io.example.WorkerVerticle",
new DeploymentOptions().setWorker(true));
}
}
// ----
package io.example;
/**
* An example of a worker verticle
*/
public class WorkerVerticle extends AbstractVerticle {
@Override
public void start() throws Exception {
System.out.println("[Worker] Starting in " +
Thread.currentThread().getName());
// consume event bus messages sent to address "sample.data"
// reply with incoming message transformed to upper case
vertx.eventBus().<String>consumer("sample.data", message -> {
Thread.sleep(1000); // will not block the event loop
// but only this verticle
System.out.println("[Worker] Consuming data in " +
Thread.currentThread().getName());
String body = message.body();
message.reply(body.toUpperCase());
});
}
}