You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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机制冲突,通常和类加载阶段的内存压力过大有关,可尝试以下几种修复方式:

  1. 升级Pact依赖版本
    旧版本Pact使用的ClassGraph存在GCLocker相关的已知问题,升级到4.6.14及以上版本即可解决。修改依赖配置:

    testImplementation 'au.com.dius.pact.provider:junit5:4.6.14'
    
  2. 增加测试进程的JVM内存
    给测试任务分配更多堆内存,缓解GC压力:

    • 本地运行时,添加JVM参数:-Xmx2G -Xms1G
    • GitLab流水线中,在CI配置里设置:
      test:
        script:
          - ./gradlew test -Xmx2G -Xms1G
      
  3. 禁用ClassGraph类扫描
    通过系统属性强制Pact使用旧的类扫描方式,避免ClassGraph的问题,在@BeforeAll中添加:

    System.setProperty("pact.disable.classgraph", "true");
    
  4. 临时简化测试对象
    暂时减少测试对象的嵌套层级或字段数量,确认错误是否由对象序列化时内存占用过高触发,再结合前三种方案彻底解决。

内容的提问来源于stack exchange,提问作者APK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:14:52