Реактивная гибернация на Quarkus с Flyway

Я столкнулся с проблемой при попытке использовать расширение Quarkus Flyway с Quarkus Reactive Hibernate и RESTEasy. При запуске своего приложения я получаю следующую ошибку:

      [io.qu.ru.Application] (Quarkus Main Thread) Failed to start application (with profile dev): java.lang.IllegalStateException: Booting an Hibernate Reactive serviceregistry on a non-reactive RecordedState!
    at io.quarkus.hibernate.reactive.runtime.boot.registry.PreconfiguredReactiveServiceRegistryBuilder.checkIsReactive(PreconfiguredReactiveServiceRegistryBuilder.java:76)
    at io.quarkus.hibernate.reactive.runtime.boot.registry.PreconfiguredReactiveServiceRegistryBuilder.<init>(PreconfiguredReactiveServiceRegistryBuilder.java:66)
    at io.quarkus.hibernate.reactive.runtime.FastBootHibernateReactivePersistenceProvider.rewireMetadataAndExtractServiceRegistry(FastBootHibernateReactivePersistenceProvider.java:177)
    at io.quarkus.hibernate.reactive.runtime.FastBootHibernateReactivePersistenceProvider.getEntityManagerFactoryBuilderOrNull(FastBootHibernateReactivePersistenceProvider.java:156)
    at io.quarkus.hibernate.reactive.runtime.FastBootHibernateReactivePersistenceProvider.createEntityManagerFactory(FastBootHibernateReactivePersistenceProvider.java:82)

Вот соответствующие конфигурации Quarkus:

      quarkus:
  datasource:
    db-kind: "postgresql"
    username: "sarah"
    password: "connor"
    jdbc:
      ~: true
      url: "jdbc:postgresql://localhost:5432/mybase"
    reactive:
      ~: true
      url: "postgresql://localhost:5432/mybase"

И соответствующие зависимости:

      <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-hibernate-reactive-panache</artifactId>
</dependency>
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-reactive-pg-client</artifactId>
</dependency>
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-flyway</artifactId>
</dependency>
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-jdbc-postgresql</artifactId>
</dependency>

Отключение конфигурации JDBC с помощью ~: falseпозволяет избежать исключения, но тогда приложение не запускает миграцию Flyway во время запуска. В этом случае я вижу следующее сообщение:

      [io.qu.ag.de.AgroalProcessor] (build-39) The Agroal dependency is present but no JDBC datasources have been defined.

По некоторым вопросам Quarkus я обнаружил, что действительно невозможно одновременно запустить реактивное и блокирующее соединение с базой данных, но есть ли способ заставить Flyway работать с реактивным приложением Quarkus?

1 ответ

Решение

В настоящее время они действительно не поддерживают одновременную блокировку JDBC и реактивного клиента sql. Обходной путь - отключить JDBC для среды выполнения Quarkus и написать собственную оболочку для выполнения миграции Flyway.

Нижеприведенный обходной путь основан на соответствующей проблеме GitHub .

Обертка Flyway для запуска при запуске приложения:

      @ApplicationScoped
public class RunFlyway {

    @ConfigProperty(name = "myapp.flyway.migrate")
    boolean runMigration;

    @ConfigProperty(name = "quarkus.datasource.reactive.url")
    String datasourceUrl;
    @ConfigProperty(name = "quarkus.datasource.username")
    String datasourceUsername;
    @ConfigProperty(name = "quarkus.datasource.password")
    String datasourcePassword;

    public void runFlywayMigration(@Observes StartupEvent event) {
        if (runMigration) {
            Flyway flyway = Flyway.configure().dataSource("jdbc:" + datasourceUrl, datasourceUsername, datasourcePassword).load();
            flyway.migrate();
        }
    }
}

pom.xml:

      <!-- DB -->
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-reactive-pg-client</artifactId>
</dependency>
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-hibernate-reactive</artifactId>
</dependency>

<!-- Flyway -->
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-flyway</artifactId>
</dependency>
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-jdbc-postgresql</artifactId>
</dependency>

application.yml:

      myapp:
  flyway:
    migrate: true
quarkus:
  datasource:
    db-kind: postgresql
    username: myuser
    password: mypassword
    jdbc: false
    reactive:
      url: postgresql://localhost:5432/mydb
Другие вопросы по тегам