Skip to content

初始化拉取配置时spi机制失效,classloader问题 #351

@xiaomaguohe001

Description

@xiaomaguohe001

Issue Description

在启动类中
1、注入

@NacosInjected
private ConfigService configService;

2、在注解@PostConstruct修饰的方法内部通过

CompletableFuture.runAsync(() -> {
    configService.getConfig("dataId", "group", 5000L);
});

Describe what happened (or what feature you want)

idea启动正常,但通过打包后,jar -jar方式启动则 上面异步线程中 无法获取到配置 报异常com.alibaba.nacos.common.remote.exception.RemoteException: errCode: 500, errMsg: Unknown payload type:ServerCheckResponse

Describe what you expected to happen

理论上应该获取到配置,目前看是spi加载实现类失效,因为在jar -jar方式启动时 ForkJoinPool使用的是jdk.internal.loader.ClassLoaders$AppClassLoader 而main方法是org.springframework.boot.loader.LaunchedURLClassLoader

How to reproduce it (as minimally and precisely as possible)

  1. java --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens java.base/java.math=ALL-UNNAMED --add-opens java.base/sun.net.util=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/java.security=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED --add-opens java.base/java.time=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED -Xms1G -Xmx1G -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:+UseG1GC -XX:+AlwaysPreTouch -XX:-ResizePLAB -XX:+ParallelRefProcEnabled -XX:+ExplicitGCInvokesConcurrent -XX:MaxGCPauseMillis=50 -XX:+UseStringDeduplication -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=10 -XX:InitiatingHeapOccupancyPercent=45 -Xbootclasspath/a:D:\work\project\service\src\main\resources\config\pre -jar D:\work\project\service\target\service.jar com.xxx.yyyy.ApplicationStart

Tell us your environment

环境为:spring-boot项目当中 2.7.18版本 jdk17

Anything else we need to know?

目前使用的客户端依赖

<dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>0.3.0-RC</version>
            <exclusions>
                <exclusion>
                    <artifactId>nacos-client</artifactId>
                    <groupId>com.alibaba.nacos</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>nacos-spring-context</artifactId>
                    <groupId>com.alibaba.nacos</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>2.4.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>simpleclient</artifactId>
                    <groupId>io.prometheus</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-common</artifactId>
            <version>2.4.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>nacos-api</artifactId>
                    <groupId>com.alibaba.nacos</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>commons-io</artifactId>
                    <groupId>commons-io</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <artifactId>nacos-spring-context</artifactId>
            <groupId>com.alibaba.nacos</groupId>
            <version>2.1.1-RC</version>
            <exclusions>
                <exclusion>
                    <artifactId>nacos-client</artifactId>
                    <groupId>com.alibaba.nacos</groupId>
                </exclusion>
            </exclusions>
        </dependency>

目前暂时这么解决的:

ClassLoader loader = Thread.currentThread().getContextClassLoader();
CompletableFuture.runAsync(() -> {
    Thread.currentThread().setContextClassLoader(loader);
    configService.getConfig("dataId", "group", 5000L);
});

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions