Vertx ExecuteBlocking использует цикл событий вместо рабочего потока ⇐ JAVA
-
Anonymous
Vertx ExecuteBlocking использует цикл событий вместо рабочего потока
Я исходю из концепции один запрос = один поток, и теперь я хочу понять концепцию цикла событий с использованием Vertx. Согласно документации, если мы используем операцию блокировки, мы должны передать ее методу executeBlocking.
Вертикулы используют рабочий пул Vert.x для выполнения блокирующих действий, т. е. ExecuteBlocking или рабочая вершина. У меня есть несколько вопросов по этому абзацу из http://vertx.io/docs/vertx-core/groovy/
Это мой код:
публичный класс JdbcVertx расширяет AbstractVerticle{ public static void main(String[] args) { Vertx v = Vertx.vertx(); v.deployVerticle(new JdbcVertx(),new DeploymentOptions().setWorkerPoolSize(10)); } @Override public void start() выдает исключение { Клиент JDBCClient = JDBCClient.createNonShared(this.vertx, new JsonObject() .put("url", "jdbc:postgresql://localhost:5432/test") .put("пользователь", "postgres") .put("пароль", "пароль") .put("driver_class", "org.postgresql.Driver") .put("max_pool_size", 30)); this.vertx.createHttpServer() .requestHandler(r -> { int я = (int) (Math.random() * 100); System.out.println("Идентификатор запроса: " + i+ " "+Thread.currentThread().getName()); client.getConnection(обработчик -> { если (handler.failed()) { выдать новое RuntimeException(handler.cause()); } еще { окончательное соединение SQLConnection = handler.result(); this.vertx.executeBlocking(blockingCodeHandler->{ Connection.execute(execute(), hndlr -> { Connection.close(closehndlr -> { если (closehndlr.failed()) { выбросить новое RuntimeException(closehndlr.cause()); } еще { System.out.println("CON end: "+i+" "+Thread.currentThread().getName()); r.response().putHeader("тип контента", "текст/html").end("Ответ: " + i); } }); }); },false,as->{}); } }); }).слушать(8080); } частная строка выполнить () { return «вставить в мусор (имя) значения («тест»)»; } Я отправляю 100 запросов на http-сервер, вот что:
Идентификатор запроса: 45 vert.x-eventloop-thread-0 Идентификатор запроса: 22 vert.x-eventloop-thread-0 Идентификатор запроса: 96 vert.x-eventloop-thread-0 Идентификатор запроса: 85 vert.x-eventloop-thread-0 Идентификатор запроса: 33 vert.x-eventloop-thread-0 Конец CON: 22 vert.x-eventloop-thread-0 Конец CON: 33 vert.x-eventloop-thread-0 Конец CON: 45 vert.x-eventloop-thread-0 Конец CON: 85 vert.x-eventloop-thread-0 1) Как цикл событий переключается между запросами (на выходе он сначала получает несколько запросов, а затем выдает на них ответы)?
2)Я использую метод executeBlocking, но, как вы можете видеть, код выше использует только поток цикла событий с именем vert.x-eventloop-thread-0
3) Согласно первому вопросу, цикл событий vertx переключается между запросами, но если я изменю метод execute на:
частная строка выполнить(){ Thread.sleep(3000); return «вставить в мусор (имя) значения («тест»)»; } Цикл событий остановится до тех пор, пока не истечет время ожидания
Заранее спасибо
Я исходю из концепции один запрос = один поток, и теперь я хочу понять концепцию цикла событий с использованием Vertx. Согласно документации, если мы используем операцию блокировки, мы должны передать ее методу executeBlocking.
Вертикулы используют рабочий пул Vert.x для выполнения блокирующих действий, т. е. ExecuteBlocking или рабочая вершина. У меня есть несколько вопросов по этому абзацу из http://vertx.io/docs/vertx-core/groovy/
Это мой код:
публичный класс JdbcVertx расширяет AbstractVerticle{ public static void main(String[] args) { Vertx v = Vertx.vertx(); v.deployVerticle(new JdbcVertx(),new DeploymentOptions().setWorkerPoolSize(10)); } @Override public void start() выдает исключение { Клиент JDBCClient = JDBCClient.createNonShared(this.vertx, new JsonObject() .put("url", "jdbc:postgresql://localhost:5432/test") .put("пользователь", "postgres") .put("пароль", "пароль") .put("driver_class", "org.postgresql.Driver") .put("max_pool_size", 30)); this.vertx.createHttpServer() .requestHandler(r -> { int я = (int) (Math.random() * 100); System.out.println("Идентификатор запроса: " + i+ " "+Thread.currentThread().getName()); client.getConnection(обработчик -> { если (handler.failed()) { выдать новое RuntimeException(handler.cause()); } еще { окончательное соединение SQLConnection = handler.result(); this.vertx.executeBlocking(blockingCodeHandler->{ Connection.execute(execute(), hndlr -> { Connection.close(closehndlr -> { если (closehndlr.failed()) { выбросить новое RuntimeException(closehndlr.cause()); } еще { System.out.println("CON end: "+i+" "+Thread.currentThread().getName()); r.response().putHeader("тип контента", "текст/html").end("Ответ: " + i); } }); }); },false,as->{}); } }); }).слушать(8080); } частная строка выполнить () { return «вставить в мусор (имя) значения («тест»)»; } Я отправляю 100 запросов на http-сервер, вот что:
Идентификатор запроса: 45 vert.x-eventloop-thread-0 Идентификатор запроса: 22 vert.x-eventloop-thread-0 Идентификатор запроса: 96 vert.x-eventloop-thread-0 Идентификатор запроса: 85 vert.x-eventloop-thread-0 Идентификатор запроса: 33 vert.x-eventloop-thread-0 Конец CON: 22 vert.x-eventloop-thread-0 Конец CON: 33 vert.x-eventloop-thread-0 Конец CON: 45 vert.x-eventloop-thread-0 Конец CON: 85 vert.x-eventloop-thread-0 1) Как цикл событий переключается между запросами (на выходе он сначала получает несколько запросов, а затем выдает на них ответы)?
2)Я использую метод executeBlocking, но, как вы можете видеть, код выше использует только поток цикла событий с именем vert.x-eventloop-thread-0
3) Согласно первому вопросу, цикл событий vertx переключается между запросами, но если я изменю метод execute на:
частная строка выполнить(){ Thread.sleep(3000); return «вставить в мусор (имя) значения («тест»)»; } Цикл событий остановится до тех пор, пока не истечет время ожидания
Заранее спасибо
Мобильная версия