Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
hxc001 opened this issue Oct 12, 2024 · 0 comments
Open

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

hxc001 opened this issue Oct 12, 2024 · 0 comments

Comments

@hxc001
Copy link

hxc001 commented Oct 12, 2024

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);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant