Quarkus Panache Reactive, почему транзакция не может быть отправлена/подписана из потока исполнителя ⇐ JAVA
Quarkus Panache Reactive, почему транзакция не может быть отправлена/подписана из потока исполнителя
Я пытаюсь использовать реактивную версию Panache вместо классической Hibernate-ORM.
Я пытаюсь обернуть свою функцию, возвращающую Uni, аннотацией @ReactiveTransactional
в моем слое ресурсов:
@GET @Produces(MediaType.APPLICATION_JSON) @Path("/транзакционный-тест") public Uni testTxnQuerySearch() { вернуть mySQLService.testTransactional(); } в классе MySQLService:
@ReactiveTransactional public Uni testTransactional() { // создание данных Uni uni1 = mySqlRepo1.doTransaction(data1); Uni uni2 = mySqlRepo2.doTransaction(data2); Uni uni3 = mySqlRepo3.doTransaction(data3); // присоединение к универу вернуться в университет .runSubscriptionOn(Infrastructure.getDefaultWorkerPool()); } когда я вызываю API, я получаю следующее исключение:
[Exception 0] java.lang.IllegalStateException: HR000069: обнаружено использование реактивного сеанса из потока, отличного от того, который использовался для открытия реактивного сеанса — это предполагает недопустимую интеграцию; исходная тема [136]: 'vert.x-eventloop-thread-1' текущая тема [142]: 'executor-thread-1' [Исключение 1] java.lang.IllegalStateException: HR000068: этот метод следует вызывать исключительно из потока EventLoop Vert.x; в настоящее время работает в потоке «executor-thread-1» Думаю, это потому, что я добавил эту строку:
.runSubscriptionOn(Infrastructure.getDefaultWorkerPool()); Но почему это незаконно? Разве операция блокировки (например, транзакция БД) не должна выполняться с использованием рабочего пула?
Я относительно новичок в реактивном программировании и Quarkus, поэтому извините, если это очень простой вопрос
Я пытаюсь использовать реактивную версию Panache вместо классической Hibernate-ORM.
Я пытаюсь обернуть свою функцию, возвращающую Uni, аннотацией @ReactiveTransactional
в моем слое ресурсов:
@GET @Produces(MediaType.APPLICATION_JSON) @Path("/транзакционный-тест") public Uni testTxnQuerySearch() { вернуть mySQLService.testTransactional(); } в классе MySQLService:
@ReactiveTransactional public Uni testTransactional() { // создание данных Uni uni1 = mySqlRepo1.doTransaction(data1); Uni uni2 = mySqlRepo2.doTransaction(data2); Uni uni3 = mySqlRepo3.doTransaction(data3); // присоединение к универу вернуться в университет .runSubscriptionOn(Infrastructure.getDefaultWorkerPool()); } когда я вызываю API, я получаю следующее исключение:
[Exception 0] java.lang.IllegalStateException: HR000069: обнаружено использование реактивного сеанса из потока, отличного от того, который использовался для открытия реактивного сеанса — это предполагает недопустимую интеграцию; исходная тема [136]: 'vert.x-eventloop-thread-1' текущая тема [142]: 'executor-thread-1' [Исключение 1] java.lang.IllegalStateException: HR000068: этот метод следует вызывать исключительно из потока EventLoop Vert.x; в настоящее время работает в потоке «executor-thread-1» Думаю, это потому, что я добавил эту строку:
.runSubscriptionOn(Infrastructure.getDefaultWorkerPool()); Но почему это незаконно? Разве операция блокировки (например, транзакция БД) не должна выполняться с использованием рабочего пула?
Я относительно новичок в реактивном программировании и Quarkus, поэтому извините, если это очень простой вопрос
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему findById возвращает устаревшие данные с помощью Hibernate Reactive и Panache?
Anonymous » » в форуме JAVA - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему findById возвращает устаревшие данные с помощью Hibernate Reactive и Panache?
Anonymous » » в форуме JAVA - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-