我想对一个新的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()
}
}
}
Something将quarkus.datasource.jdbc.url
env变量设置为正确值,包括Postgres正在侦听的随机分配端口。datasourceUsername
、datasourcePassword
未在我的application.yml
中设置。
先决条件是您同时具有JDBC和反应依赖关系(请参阅我的build.gradle.kts
(