#java #multithreading #vert.x #quarkus
#Ява #многопоточность #верт.х #кваркус
Вопрос:
Я изучаю quarkus, mutiny и vert.x. Я хочу создавать соединения с двумя базами данных и получать данные параллельно.
Я создаю две похожие вершины (вторая вершина отличается только именем источника данных, отображателем и сущностью).:
@ApplicationScoped public class DbFruitVerticle extends AbstractVerticle { private static final Logger LOGGER = Logger.getLogger(DbFruitVerticle.class); @Inject @ReactiveDataSource("fruit") PgPool pgPoolFruit; @Override public Unilt;Voidgt; asyncStart() { LOGGER.info("gt;gt;gt; DbFruitVerticle asyncStart"); return vertx.eventBus().consumer("runrun").handler(m -gt; { LOGGER.info("gt;gt;gt; Start Handler"); getAll().subscribe() .with(fruit -gt; LOGGER.info("gt;gt;gt; fruit " fruit.getId()), fail -gt; fail.printStackTrace()); } ).completionHandler(); } public Multilt;Fruitgt; getAll() { return pgPoolFruit.query("select f.* from fruit f").execute() .onItem().transformToMulti(set -gt; Multi.createFrom().iterable(set)) .onItem().transform(this::mapFruit); } // mapper }
вершины дельпоя:
public void init(@Observes StartupEvent event, Vertx vertx, DbTestVerticle dbTestVerticle, DbFruitVerticle dbFruitVerticle) { vertx.deployVerticle(dbTestVerticle).await().indefinitely(); vertx.deployVerticle(dbFruitVerticle).await().indefinitely(); }
Вызов процесса:
eventBus.publish("runrun", "run");
И посмотреть журнал:
2021-12-02 17:02:01,551 INFO [org.byb.ver.DbFruitVerticle] (vert.x-eventloop-thread-6) gt;gt;gt; fruit 1 2021-12-02 17:02:01,551 INFO [org.byb.ver.DbFruitVerticle] (vert.x-eventloop-thread-6) gt;gt;gt; fruit 3 2021-12-02 17:02:01,552 INFO [org.byb.ver.DbFruitVerticle] (vert.x-eventloop-thread-6) gt;gt;gt; fruit 4 2021-12-02 17:02:01,552 INFO [org.byb.ver.DbFruitVerticle] (vert.x-eventloop-thread-6) gt;gt;gt; fruit 5 2021-12-02 17:02:01,552 INFO [org.byb.ver.DbFruitVerticle] (vert.x-eventloop-thread-6) gt;gt;gt; fruit 6 2021-12-02 17:02:01,752 INFO [org.byb.ver.DbTestVerticle] (vert.x-eventloop-thread-5) gt;gt;gt; bill 1 2021-12-02 17:02:01,753 INFO [org.byb.ver.DbTestVerticle] (vert.x-eventloop-thread-5) gt;gt;gt; bill 2 2021-12-02 17:02:01,753 INFO [org.byb.ver.DbTestVerticle] (vert.x-eventloop-thread-5) gt;gt;gt; bill 3
Кажется, что сначала обрабатывается поток-6, а затем поток-5. Почему они не параллельны? Как сделать их параллельными? Существует ли наилучшая практика для подобных задач? Пожалуйста, помогите.
Комментарии:
1. Я бы сказал, что они работают параллельно. Увеличьте количество записей в вашей базе данных до нескольких сотен, чтобы отбор и обработка данных занимали более значительное количество времени. При вашей текущей настройке фурий и счет обрабатываются менее чем за 1 мс
2. Я добавляю строки в таблицы (6000 и 8000), кажется, они в порядке: ` 2021-12-02 19:14:40 622 ИНФОРМАЦИЯ [org.byb.ver. DbTestVerticle] (vert.x-eventloop-поток-5) gt;gt;gt;gt;gt;gt; счет 2371 2021-12-02 19:14:40 622 ИНФОРМАЦИЯ [org.byb.ver. DbTestVerticle] (vert.x-eventloop-поток-5) gt;gt;gt;gt;gt;gt; счет 2372 2021-12-02 19:14:40 620 ИНФОРМАЦИЯ [org.byb.ver. DbFruitVerticle] (версия x-eventloop-поток-6) gt;gt;gt;gt;gt;gt; фрукты 5678 2021-12-02 19:14:40 622 ИНФОРМАЦИЯ [org.byb.ver. DbTestVerticle] (vert.x-eventloop-поток-5) gt;gt;gt;gt;gt;gt; счет 2373 2021-12-02 19:14:40 622 ИНФОРМАЦИЯ [org.byb.ver. DbFruitVerticle] (vert.x-eventloop-поток-6) gt;gt;gt;gt;gt;gt; фрукты 5679 ` Спасибо!