Quarkus Hibernate Reactive — транзакция не выполняется (подписывается) внутри обработчика событий
Я использую Hibernate Reactive с Panache. У меня есть следующий обработчик событий:
@ConsumeEvent(value = "save-result")
@ReactiveTransactional
public Uni<ResultEntity> saveResult(ResultMessage msg) {
ResultEntity result= msg.getResultEntity();
result.setComplete(true);
LOGGER.log(Level.INFO, "======> About to save Result: {0}", result);
return resultRepository.persistAndFlush(result)
.onItem().invoke(() -> LOGGER.log(Level.INFO,
"Result has been saved");
}
Событие потребляется (распечатывается журнал «О сохранении...»), но сущность не сохраняется . Как будто на транзакцию не подписана. (сообщение журнала «Результат сохранен» также не печатается)
Я использую Quarkus 2.16.7 (до этого пробовал с 2.12.x, но безуспешно).
Обратите внимание, что у меня есть другой bean-компонент ApplicationScoped, где аналогичная операция (хотя и более сложная) работает нормально.
Я не новичок в Quarkus (работаю с ним пару месяцев), но и не эксперт, и все же ошарашен тем, что это не работает.
Почему транзакция не выполняется? Я что-то пропустил?
ОБНОВЛЕНИЕ: В целях тестирования я немного изменил код, добавив еще одну строку журнала, как показано ниже, чтобы проверить, подписывается ли Uni и, по-видимому, так оно и есть (поскольку выводится «----> in flow») , однако объект не сохраняется, и сообщение «Результат был сохранен» также никогда не печатается.
@ConsumeEvent(value = "save-result")
@ReactiveTransactional
public Uni<ResultEntity> saveResult(ResultMessage msg) {
ResultEntity result= msg.getResultEntity();
result.setComplete(true);
LOGGER.log(Level.INFO, "======> About to save Result: {0}", result);
return Uni.createFrom().voidItem().onItem()
.invoke(() -> LOGGER.log(Level.INFO,"----> in flow"))
.onItem().transformToUni(unused -> resultRepository.persistAndFlush(result)
.onItem().invoke(() -> LOGGER.log(Level.INFO,
"Result has been saved")));
}
Я подозреваю, что это может быть проблема, похожая на https://github.com/quarkusio/quarkus/issues/12925 или https://github.com/quarkusio/quarkus/issues/14591 , но я не могу это подтвердить.
1 ответ
Поэтому я добавил.onFailure().invoke(Throwable::printStackTrace)
сразу послеpersistAndFlush
и увидел, что операция вызвала исключение HibernateException.
Это означает, что исключения автоматически перехватываются и игнорируются при выполнении внутри@ConsumeEvent
метод, и поэтому транзакция никогда не завершается. (аналогично закрытым вопросам, описанным здесь и здесь ).
Похоже, для этого нужно открыть еще один вопрос.