Quarkus:Flyway无法连接到postgres开发人员服务



我想对一个新的postresql容器运行集成测试,该容器包含由Flyway创建的数据库。

build.gradle.kts:

dependencies {
implementation("io.quarkus:quarkus-reactive-pg-client")
// flyway does not work with the reactive driver right now, a workaround with a classic driver
implementation("io.quarkus:quarkus-jdbc-postgresql")
implementation("io.quarkus:quarkus-flyway:2.6.1.Final")
}

application.yml

application:
flyway:
migrate: true
quarkus:
datasource:
db-kind: postgresql
devservices:
enabled: true
image-name: "postgres:14.1-alpine"
"%dev":
quarkus:
datasource:
jdbc: false
devservices:
enabled: false
username: ${db.user}
password: ${db.pwd}
reactive:
url: postgresql://${db.host}:${db.port}/${db.name}
flyway:
migrate-at-start: true

QUARKUS_PROFILE=test ./gradlew --info test-integration

一开始看起来不错:开发服务启动指定的postgres容器:

2022-03-14 13:54:19,527 INFO  [🐳 .1-alpine]] (build-29) Creating container for image: postgres:14.1-alpine
2022-03-14 13:54:19,557 INFO  [🐳 .1-alpine]] (build-29) Starting container with ID: d1ab***snip***4c96a
2022-03-14 13:54:19,770 INFO  [🐳 .1-alpine]] (build-29) Container postgres:14.1-alpine is starting: d1ab***snip***4c96a
2022-03-14 13:54:20,759 INFO  [🐳 .1-alpine]] (build-29) Container postgres:14.1-alpine started in PT1.248185S

但是Flyway失败了。。。

Caused by:
java.lang.RuntimeException: Failed to start quarkus
...
Caused by:
org.flywaydb.core.api.FlywayException: No database found to handle jdbc:vertx-reactive:postgresql://localhost:51445/default?loggerLevel=OFF
at org.flywaydb.core.internal.database.DatabaseTypeRegister.getDatabaseTypeForUrl(DatabaseTypeRegister.java:55)

好的是,这个集装箱有一个随机端口(51445(,它以某种方式被传递到了飞行通道。我不知道为什么Flyway使用反应式URL。如果我理解正确,它成功连接到容器,但数据库(standard(不在那里?

Quarkus版本:2.6.3.最终

Quarkus目前还不支持Flyway+Reactive数据源。请参阅此了解更多详细信息。

我找到了一个解决方案:以下bean在应用程序启动时运行("观察StartupEvent"(,并配置Flyway使用JDBC驱动程序进行迁移:

import io.quarkus.runtime.StartupEvent
import javax.enterprise.context.ApplicationScoped
import javax.enterprise.event.Observes
import org.eclipse.microprofile.config.inject.ConfigProperty
import org.flywaydb.core.Flyway
@ApplicationScoped
class MigrationServiceConfiguration {
@ConfigProperty(name = "application.flyway.migrate")
lateinit var runMigration: String
@ConfigProperty(name = "quarkus.datasource.jdbc.url")
lateinit var datasourceJdbcUrl: String
@ConfigProperty(name = "quarkus.datasource.username")
lateinit var datasourceUsername: String
@ConfigProperty(name = "quarkus.datasource.password")
lateinit var datasourcePassword: String
fun runFlywayMigration(@Observes event: StartupEvent) {
if ("true" == runMigration) {
val flyway =
Flyway.configure().dataSource(datasourceJdbcUrl, datasourceUsername, datasourcePassword).load()
flyway.migrate()
}
}
}

Somethingquarkus.datasource.jdbc.urlenv变量设置为正确值,包括Postgres正在侦听的随机分配端口。datasourceUsernamedatasourcePassword未在我的application.yml中设置。

先决条件是您同时具有JDBC和反应依赖关系(请参阅我的build.gradle.kts(

最新更新