From 9c8d7e56031874ea88c6dfea4e9a0ce3f8cf2fc6 Mon Sep 17 00:00:00 2001 From: provenceee <83857838+provenceee@users.noreply.github.com> Date: Mon, 18 Nov 2024 21:18:34 +0800 Subject: [PATCH] *fix spi classloader Signed-off-by: provenceee <83857838+provenceee@users.noreply.github.com> --- .../io/sermant/core/utils/ClassUtils.java | 19 ++++++++++++++++--- .../retry/ExtensionLoaderInterceptor.java | 12 ++++++++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/sermant-agentcore/sermant-agentcore-core/src/main/java/io/sermant/core/utils/ClassUtils.java b/sermant-agentcore/sermant-agentcore-core/src/main/java/io/sermant/core/utils/ClassUtils.java index cb21315702..e5183eb7d7 100644 --- a/sermant-agentcore/sermant-agentcore-core/src/main/java/io/sermant/core/utils/ClassUtils.java +++ b/sermant-agentcore/sermant-agentcore-core/src/main/java/io/sermant/core/utils/ClassUtils.java @@ -43,15 +43,17 @@ private ClassUtils() { * * @param className Class fully qualified name * @param classLoader The classloader of the enhanced class + * @param classResourceLoader The classResourceLoader of the enhanced class * @return defined class */ - public static Optional> defineClass(String className, ClassLoader classLoader) { - if (classLoader == null || className == null) { + public static Optional> defineClass(String className, ClassLoader classLoader, + ClassLoader classResourceLoader) { + if (classLoader == null || className == null || classResourceLoader == null) { return Optional.empty(); } try { return Optional.of(ClassLoaderUtils.defineClass(className, classLoader, ClassLoaderUtils - .getClassResource(ClassLoader.getSystemClassLoader(), className))); + .getClassResource(classResourceLoader, className))); } catch (InvocationTargetException ex) { LOGGER.fine(String.format(Locale.ENGLISH, "Can not define class [%s], reason: [%s], may be it has been " + "defined, so try to load it!", className, ex.getMessage())); @@ -64,6 +66,17 @@ public static Optional> defineClass(String className, ClassLoader class return loadClass(className, classLoader); } + /** + * Load the class by specifying the classloader + * + * @param className Class fully qualified name + * @param classLoader The classloader of the enhanced class + * @return defined class + */ + public static Optional> defineClass(String className, ClassLoader classLoader) { + return defineClass(className, classLoader, ClassLoader.getSystemClassLoader()); + } + /** * load class * diff --git a/sermant-plugins/sermant-flowcontrol/flowcontrol-plugin/src/main/java/io/sermant/flowcontrol/retry/ExtensionLoaderInterceptor.java b/sermant-plugins/sermant-flowcontrol/flowcontrol-plugin/src/main/java/io/sermant/flowcontrol/retry/ExtensionLoaderInterceptor.java index bc142cc238..10ad581802 100644 --- a/sermant-plugins/sermant-flowcontrol/flowcontrol-plugin/src/main/java/io/sermant/flowcontrol/retry/ExtensionLoaderInterceptor.java +++ b/sermant-plugins/sermant-flowcontrol/flowcontrol-plugin/src/main/java/io/sermant/flowcontrol/retry/ExtensionLoaderInterceptor.java @@ -73,14 +73,18 @@ protected ExecuteContext doAfter(ExecuteContext context) { final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); if (APACHE_DUBBO_CLUSTER_CLASS_NAME.equals(type.getName())) { ClassUtils.defineClass( - "io.sermant.flowcontrol.retry.cluster.ApacheDubboClusterInvoker", contextClassLoader); + "io.sermant.flowcontrol.retry.cluster.ApacheDubboClusterInvoker", contextClassLoader, + contextClassLoader); retryInvokerClass = ClassUtils.defineClass( - "io.sermant.flowcontrol.retry.cluster.ApacheDubboCluster", contextClassLoader); + "io.sermant.flowcontrol.retry.cluster.ApacheDubboCluster", contextClassLoader, + contextClassLoader); } else if (ALIBABA_DUBBO_CLUSTER_CLASS_NAME.equals(type.getName())) { ClassUtils.defineClass( - "io.sermant.flowcontrol.retry.cluster.AlibabaDubboClusterInvoker", contextClassLoader); + "io.sermant.flowcontrol.retry.cluster.AlibabaDubboClusterInvoker", contextClassLoader, + contextClassLoader); retryInvokerClass = ClassUtils.defineClass( - "io.sermant.flowcontrol.retry.cluster.AlibabaDubboCluster", contextClassLoader); + "io.sermant.flowcontrol.retry.cluster.AlibabaDubboCluster", contextClassLoader, + contextClassLoader); } else { return context; }