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метод, и поэтому транзакция никогда не завершается. (аналогично закрытым вопросам, описанным здесь и здесь ).

Похоже, для этого нужно открыть еще один вопрос.

Другие вопросы по тегам