Quarkus应用Pact Provider测试报错:ClassGraph-worker-11 GC等待重试过频
问题描述
我有一个Quarkus应用,会向Kafka主题发送消息供另一个服务消费。我正在使用Pact编写Provider测试(测试中创建包含8-9个字段且存在多层嵌套的对象,用于发送并验证契约),但在本地和GitLab流水线中均遇到以下错误:
ClassGraph-worker-11: Retried waiting for GCLocker too often allocating 120718 words
代码片段
import au.com.dius.pact.provider.MessageAndMetadata; import au.com.dius.pact.provider.PactVerifyProvider; import au.com.dius.pact.provider.junit5.MessageTestTarget; import au.com.dius.pact.provider.junit5.PactVerificationContext; import au.com.dius.pact.provider.junit5.PactVerificationInvocationContextProvider; import au.com.dius.pact.provider.junitsupport.Provider; import au.com.dius.pact.provider.junitsupport.loader.PactBroker; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.extension.ExtendWith; import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.Map; @Provider("a-message-provider") @PactBroker(url = "broker-url") public class AnyMessageProviderTest { private final ObjectMapper objectMapper = new ObjectMapper(); @BeforeAll public static void setUp() { System.setProperty("pact_do_not_track", "true"); System.setProperty("pact.verifier.publishResults", "true"); System.setProperty("pact.provider.version", "v1.0.0"); } @BeforeEach void before(PactVerificationContext context) { context.setTarget(new MessageTestTarget()); } @TestTemplate @ExtendWith(PactVerificationInvocationContextProvider.class) void pactVerificationTestTemplate(PactVerificationContext context) { context.verifyInteraction(); } @PactVerifyProvider("An kafka message") MessageAndMetadata verifyOddsChange() throws IOException { // 创建嵌套结构的Event对象 return new MessageAndMetadata(objectMapper.writeValueAsBytes(event), Map.of("key", "3435345")); }
环境信息
- Quarkus版本:3.9.2
- Pact依赖:
testImplementation 'au.com.dius.pact.provider:junit5:4.6.9'
解决方案
这个错误源于Pact依赖的ClassGraph库在类扫描过程中与JVM的GCLocker机制冲突,通常和类加载阶段的内存压力过大有关,可尝试以下几种修复方式:
升级Pact依赖版本
旧版本Pact使用的ClassGraph存在GCLocker相关的已知问题,升级到4.6.14及以上版本即可解决。修改依赖配置:testImplementation 'au.com.dius.pact.provider:junit5:4.6.14'增加测试进程的JVM内存
给测试任务分配更多堆内存,缓解GC压力:- 本地运行时,添加JVM参数:
-Xmx2G -Xms1G - GitLab流水线中,在CI配置里设置:
test: script: - ./gradlew test -Xmx2G -Xms1G
- 本地运行时,添加JVM参数:
禁用ClassGraph类扫描
通过系统属性强制Pact使用旧的类扫描方式,避免ClassGraph的问题,在@BeforeAll中添加:System.setProperty("pact.disable.classgraph", "true");临时简化测试对象
暂时减少测试对象的嵌套层级或字段数量,确认错误是否由对象序列化时内存占用过高触发,再结合前三种方案彻底解决。
内容的提问来源于stack exchange,提问作者APK
相关产品推荐
相关产品推荐

