Quarkus升级后Testcontainers初始化报错java.lang.InterruptedException
问题描述
将Quarkus从2.4.0版本升级到2.15.0版本后,使用docker-compose运行Quarkus集成测试时遇到Postgres容器启动失败的错误,核心异常为java.lang.InterruptedException。尝试设置更长的超时值:
quarkus.devservices.timeout=180
但问题依旧存在,相关日志如下:
[2022-12-19T08:55:14.576Z] > Task :score-integrationtest:test [2022-12-19T08:55:14.576Z] 2022-12-19 08:55:12,293 WARN [org.ecl.jet.ser.AbstractConnector] (pool-2-thread-1) Acceptors should be <= availableProcessors: NetworkTrafficServerConnector@161ff9e6{HTTP/1.1, (http/1.1, h2c)}{0.0.0.0:0} [2022-12-19T08:55:14.576Z] 2022-12-19 08:55:12,720 INFO [org.ecl.jet.ser.Server] (pool-2-thread-1) jetty-9.4.49.v20220914; built: 2022-09-14T01:07:36.601Z; git: 4231a3b2e4cb8548a412a789936d640a97b1aa0a; jvm 17.0.1+12-LTS [2022-12-19T08:55:14.576Z] 2022-12-19 08:55:12,803 INFO [org.ecl.jet.ser.han.ContextHandler] (pool-2-thread-1) Started o.e.j.s.ServletContextHandler@64f54045{/__admin,null,AVAILABLE} [2022-12-19T08:55:14.576Z] 2022-12-19 08:55:12,848 INFO [org.ecl.jet.ser.han.Con.ROOT] (pool-2-thread-1) RequestHandlerClass from context returned com.github.tomakehurst.wiremock.http.StubRequestHandler. Normalized mapped under returned 'null' [2022-12-19T08:55:14.576Z] 2022-12-19 08:55:12,856 INFO [org.ecl.jet.ser.han.ContextHandler] (pool-2-thread-1) Started o.e.j.s.ServletContextHandler@5e9f3de4{/,null,AVAILABLE} [2022-12-19T08:55:14.576Z] 2022-12-19 08:55:12,876 INFO [org.ecl.jet.ser.AbstractConnector] (pool-2-thread-1) Started NetworkTrafficServerConnector@161ff9e6{HTTP/1.1, (http/1.1, h2c)}{0.0.0.0:9701} [2022-12-19T08:55:14.576Z] 2022-12-19 08:55:12,877 INFO [org.ecl.jet.ser.Server] (pool-2-thread-1) Started @30367ms ... [2022-12-19T08:55:16.123Z] 2022-12-19 08:55:15,908 INFO [🐳 .5]] (agroal-11) Creating container for image: postgres:14.5 [2022-12-19T08:55:16.423Z] 2022-12-19 08:55:16,106 INFO [🐳 .5]] (agroal-11) Container postgres:14.5 is starting: 3225b3d78588be4297362f627043c39b27ddf5b1dd71438e153b2b5b4d07fc29 [2022-12-19T08:55:21.997Z] 2022-12-19 08:55:20,933 ERROR [🐳 .5]] (agroal-11) Could not start container: java.lang.RuntimeException: java.lang.InterruptedException [2022-12-19T08:55:21.997Z] at org.testcontainers.containers.output.WaitingConsumer.waitUntil(WaitingConsumer.java:105) [2022-12-19T08:55:21.997Z] at org.testcontainers.containers.output.WaitingConsumer.waitUntil(WaitingConsumer.java:78) [2022-12-19T08:55:21.997Z] at org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy.waitUntilReady(LogMessageWaitStrategy.java:45) [2022-12-19T08:55:21.997Z] at org.testcontainers.containers.wait.strategy.AbstractWaitStrategy.waitUntilReady(AbstractWaitStrategy.java:52) [2022-12-19T08:55:21.997Z] at org.testcontainers.containers.PostgreSQLContainer.waitUntilContainerStarted(PostgreSQLContainer.java:143) [2022-12-19T08:55:21.997Z] at org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:485) [2022-12-19T08:55:21.997Z] at org.testcontainers.containers.GenericContainer.lambda$doStart$0(GenericContainer.java:344) [2022-12-19T08:55:21.997Z] at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:81) [2022-12-19T08:55:21.997Z] at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:334) [2022-12-19T08:55:21.997Z] at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:322) [2022-12-19T08:55:21.997Z] at org.testcontainers.jdbc.ContainerDatabaseDriver.connect(ContainerDatabaseDriver.java:124) [2022-12-19T08:55:21.997Z] at io.agroal.pool.ConnectionFactory.createConnection(ConnectionFactory.java:226) [2022-12-19T08:55:21.997Z] at io.agroal.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:535) [2022-12-19T08:55:21.997Z] at io.agroal.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:516) [2022-12-19T08:55:21.997Z] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [2022-12-19T08:55:21.997Z] at io.agroal.pool.util.PriorityScheduledExecutor.beforeExecute(PriorityScheduledExecutor.java:75) [2022-12-19T08:55:21.997Z] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) [2022-12-19T08:55:21.997Z] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [2022-12-19T08:55:21.997Z] at java.base/java.lang.Thread.run(Thread.java:833) [2022-12-19T08:55:21.997Z] Caused by: java.lang.InterruptedException [2022-12-19T08:55:21.997Z] at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1679) [2022-12-19T08:55:21.997Z] at java.base/java.util.concurrent.LinkedBlockingDeque.pollLast(LinkedBlockingDeque.java:533) [2022-12-19T08:55:21.997Z] at org.testcontainers.containers.output.WaitingConsumer.waitUntil(WaitingConsumer.java:85) [2022-12-19T08:55:21.997Z] ... 18 more
解决方案
- 调整Testcontainers超时设置:
quarkus.devservices.timeout只作用于Quarkus DevServices自动管理的容器,而这里是Testcontainers直接启动Postgres,需要设置Testcontainers的超时。可以通过系统属性添加:
或者在代码中配置PostgreSQLContainer的等待超时:testcontainers.wait.timeout=300PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:14.5") .withStartupTimeout(Duration.ofSeconds(300)); - 检查Testcontainers版本兼容性:Quarkus 2.15.0默认依赖的Testcontainers版本可能和你项目中手动引入的版本冲突,确认项目中Testcontainers版本与Quarkus bom中定义的版本一致,避免兼容性问题。
- 修改容器等待策略:日志等待策略可能因为Postgres启动日志格式变化导致识别失败,改用端口等待策略:
postgres.setWaitStrategy(new WaitStrategy() { @Override public void waitUntilReady(GenericContainer container) { new HostPortWaitStrategy().withStartupTimeout(Duration.ofSeconds(300)).waitUntilReady(container); } }); - 检查Docker资源限制:Docker分配的内存、CPU不足会导致Postgres启动缓慢,触发中断。进入Docker设置,增加内存(建议至少4GB)和CPU核心数。
- 手动排查容器启动问题:直接在本地运行
docker run postgres:14.5,查看容器日志是否有初始化错误,比如权限问题、存储空间不足等,排除镜像本身的问题。
内容的提问来源于stack exchange,提问作者Chexpir
相关产品推荐
相关产品推荐

