This is an automated email from the ASF dual-hosted git repository.
liubao pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
The following commit(s) were added to refs/heads/master by this push:
new 9289a06 [SCB-715]working in thread that do not have context class
loader
9289a06 is described below
commit 9289a06ea23773710db2bcdb8ee4d9df18fc5f18
Author: liubao <[email protected]>
AuthorDate: Wed Jul 4 17:44:54 2018 +0800
[SCB-715]working in thread that do not have context class loader
---
.../servicecomb/common/javassist/JavassistUtils.java | 17 +++++------------
.../codec/protobuf/definition/ProtobufManager.java | 3 ++-
.../protobuf/utils/ScopedProtobufSchemaManager.java | 6 ++----
.../servicecomb/core/definition/MicroserviceMeta.java | 3 ++-
.../DefaultMicroserviceClassLoaderFactory.java | 4 +++-
.../classloader/MicroserviceClassLoader.java | 3 ++-
.../core/definition/schema/AbstractSchemaFactory.java | 3 ++-
.../servicecomb/demo/pojo/client/PojoClient.java | 14 ++++++++++++++
.../servicecomb/foundation/common/utils/JvmUtils.java | 18 ++++++++++++++++++
.../org/apache/servicecomb/config/ConfigMapping.java | 3 ++-
.../config/archaius/sources/AbstractConfigLoader.java | 3 ++-
.../servicecomb/loadbalance/LoadbalanceHandler.java | 3 ++-
.../loadbalance/RuleClassNameExtentionsFactory.java | 3 ++-
.../swagger/generator/core/SwaggerGenerator.java | 3 ++-
.../swagger/generator/core/utils/ClassUtils.java | 5 ++---
15 files changed, 62 insertions(+), 29 deletions(-)
diff --git
a/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/JavassistUtils.java
b/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/JavassistUtils.java
index 66bb661..2d3ed01 100644
---
a/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/JavassistUtils.java
+++
b/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/JavassistUtils.java
@@ -24,6 +24,7 @@ import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
+import org.apache.servicecomb.foundation.common.utils.JvmUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -90,9 +91,7 @@ public final class JavassistUtils {
throw new Error("values is not allowed empty.");
}
- if (classLoader == null) {
- classLoader = Thread.currentThread().getContextClassLoader();
- }
+ classLoader = JvmUtils.correctClassLoader(classLoader);
ClassPool classPool = getOrCreateClassPool(classLoader);
CtClass ctClass = classPool.makeClass(clsName);
@@ -140,9 +139,7 @@ public final class JavassistUtils {
}
public static CtClass createCtClass(ClassLoader classLoader, ClassConfig
config) {
- if (classLoader == null) {
- classLoader = Thread.currentThread().getContextClassLoader();
- }
+ classLoader = JvmUtils.correctClassLoader(classLoader);
ClassPool classPool = getOrCreateClassPool(classLoader);
CtClass ctClass = classPool.getOrNull(config.getClassName());
@@ -195,18 +192,14 @@ public final class JavassistUtils {
}
public static Class<?> createClass(ClassLoader classLoader, ClassConfig
config) {
- if (classLoader == null) {
- classLoader = Thread.currentThread().getContextClassLoader();
- }
+ classLoader = JvmUtils.correctClassLoader(classLoader);
CtClass ctClass = createCtClass(classLoader, config);
return createClass(classLoader, ctClass);
}
public static Class<?> createClass(ClassLoader classLoader, CtClass ctClass)
{
- if (classLoader == null) {
- classLoader = Thread.currentThread().getContextClassLoader();
- }
+ classLoader = JvmUtils.correctClassLoader(classLoader);
String clsName = ctClass.getName();
try {
diff --git
a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/ProtobufManager.java
b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/ProtobufManager.java
index a23f98c..ca8f9ba 100644
---
a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/ProtobufManager.java
+++
b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/ProtobufManager.java
@@ -20,6 +20,7 @@ package org.apache.servicecomb.codec.protobuf.definition;
import org.apache.servicecomb.codec.protobuf.utils.ScopedProtobufSchemaManager;
import org.apache.servicecomb.core.definition.MicroserviceMeta;
import org.apache.servicecomb.core.definition.OperationMeta;
+import org.apache.servicecomb.foundation.common.utils.JvmUtils;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.ObjectWriter;
@@ -40,7 +41,7 @@ public final class ProtobufManager {
private static final Object LOCK = new Object();
private static ScopedProtobufSchemaManager
defaultScopedProtobufSchemaManager = new ScopedProtobufSchemaManager(
- Thread.currentThread().getContextClassLoader());
+ JvmUtils.findClassLoader());
static {
// 支持在idl中定义empty message
diff --git
a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/utils/ScopedProtobufSchemaManager.java
b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/utils/ScopedProtobufSchemaManager.java
index d2b85f2..002c009 100644
---
a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/utils/ScopedProtobufSchemaManager.java
+++
b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/utils/ScopedProtobufSchemaManager.java
@@ -26,6 +26,7 @@ import
org.apache.servicecomb.codec.protobuf.utils.schema.WrapSchemaFactory;
import org.apache.servicecomb.common.javassist.JavassistUtils;
import org.apache.servicecomb.core.definition.OperationMeta;
import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
+import org.apache.servicecomb.foundation.common.utils.JvmUtils;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.type.TypeFactory;
@@ -39,10 +40,7 @@ public class ScopedProtobufSchemaManager {
private Map<String, WrapSchema> schemaCache = new ConcurrentHashMapEx<>();
public ScopedProtobufSchemaManager(ClassLoader classLoader) {
- if (classLoader == null) {
- classLoader = Thread.currentThread().getContextClassLoader();
- }
- this.classLoader = classLoader;
+ this.classLoader = JvmUtils.correctClassLoader(classLoader);
}
// 为了支持method args的场景,全部实现ProtobufMessageWrapper接口,有的场景有点浪费,不过无关紧要
diff --git
a/core/src/main/java/org/apache/servicecomb/core/definition/MicroserviceMeta.java
b/core/src/main/java/org/apache/servicecomb/core/definition/MicroserviceMeta.java
index e7a012a..7101094 100644
---
a/core/src/main/java/org/apache/servicecomb/core/definition/MicroserviceMeta.java
+++
b/core/src/main/java/org/apache/servicecomb/core/definition/MicroserviceMeta.java
@@ -24,6 +24,7 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.servicecomb.foundation.common.RegisterManager;
+import org.apache.servicecomb.foundation.common.utils.JvmUtils;
import org.apache.servicecomb.serviceregistry.RegistryUtils;
import org.apache.servicecomb.serviceregistry.api.Const;
@@ -53,7 +54,7 @@ public class MicroserviceMeta extends
CommonService<OperationMeta> {
private Map<String, Object> extData = new ConcurrentHashMap<>();
public MicroserviceMeta(String microserviceName) {
- classLoader = Thread.currentThread().getContextClassLoader();
+ classLoader = JvmUtils.findClassLoader();
parseMicroserviceName(microserviceName);
createOperationMgr("Operation meta mgr for microservice " +
microserviceName);
idSchemaMetaMgr = new RegisterManager<>("Schema meta id mgr for
microservice " + microserviceName);
diff --git
a/core/src/main/java/org/apache/servicecomb/core/definition/classloader/DefaultMicroserviceClassLoaderFactory.java
b/core/src/main/java/org/apache/servicecomb/core/definition/classloader/DefaultMicroserviceClassLoaderFactory.java
index 1534da3..6e0222d 100644
---
a/core/src/main/java/org/apache/servicecomb/core/definition/classloader/DefaultMicroserviceClassLoaderFactory.java
+++
b/core/src/main/java/org/apache/servicecomb/core/definition/classloader/DefaultMicroserviceClassLoaderFactory.java
@@ -17,11 +17,13 @@
package org.apache.servicecomb.core.definition.classloader;
+import org.apache.servicecomb.foundation.common.utils.JvmUtils;
+
public class DefaultMicroserviceClassLoaderFactory implements
MicroserviceClassLoaderFactory {
public static final MicroserviceClassLoaderFactory INSTANCE = new
DefaultMicroserviceClassLoaderFactory();
@Override
public ClassLoader create(String appId, String microserviceName, String
version) {
- return Thread.currentThread().getContextClassLoader();
+ return JvmUtils.findClassLoader();
}
}
diff --git
a/core/src/main/java/org/apache/servicecomb/core/definition/classloader/MicroserviceClassLoader.java
b/core/src/main/java/org/apache/servicecomb/core/definition/classloader/MicroserviceClassLoader.java
index cac83e8..2473aaa 100644
---
a/core/src/main/java/org/apache/servicecomb/core/definition/classloader/MicroserviceClassLoader.java
+++
b/core/src/main/java/org/apache/servicecomb/core/definition/classloader/MicroserviceClassLoader.java
@@ -17,6 +17,7 @@
package org.apache.servicecomb.core.definition.classloader;
+import org.apache.servicecomb.foundation.common.utils.JvmUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,7 +32,7 @@ public class MicroserviceClassLoader extends ClassLoader {
public MicroserviceClassLoader(String appId, String microserviceName, String
version) {
- super(Thread.currentThread().getContextClassLoader());
+ super(JvmUtils.findClassLoader());
this.appId = appId;
this.microserviceName = microserviceName;
diff --git
a/core/src/main/java/org/apache/servicecomb/core/definition/schema/AbstractSchemaFactory.java
b/core/src/main/java/org/apache/servicecomb/core/definition/schema/AbstractSchemaFactory.java
index 30e0dff..9d62c52 100644
---
a/core/src/main/java/org/apache/servicecomb/core/definition/schema/AbstractSchemaFactory.java
+++
b/core/src/main/java/org/apache/servicecomb/core/definition/schema/AbstractSchemaFactory.java
@@ -26,6 +26,7 @@ import
org.apache.servicecomb.core.definition.MicroserviceMetaManager;
import org.apache.servicecomb.core.definition.SchemaMeta;
import org.apache.servicecomb.core.definition.SchemaUtils;
import org.apache.servicecomb.core.definition.loader.SchemaLoader;
+import org.apache.servicecomb.foundation.common.utils.JvmUtils;
import org.apache.servicecomb.serviceregistry.api.Const;
import
org.apache.servicecomb.swagger.generator.core.CompositeSwaggerGeneratorContext;
import org.apache.servicecomb.swagger.generator.core.SwaggerGenerator;
@@ -76,7 +77,7 @@ public abstract class AbstractSchemaFactory<CONTEXT extends
SchemaContext> {
protected Swagger loadSwagger(String microserviceName, String schemaId) {
String path = generateSchemaPath(microserviceName, schemaId);
- URL url = Thread.currentThread().getContextClassLoader().getResource(path);
+ URL url = JvmUtils.findClassLoader().getResource(path);
if (url == null) {
return null;
}
diff --git
a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/PojoClient.java
b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/PojoClient.java
index 52f1c9b..3b55ebb 100644
---
a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/PojoClient.java
+++
b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/PojoClient.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
+import java.util.stream.IntStream;
import javax.inject.Inject;
@@ -83,7 +84,20 @@ public class PojoClient {
TestMgr.summary();
}
+ private static void testContextClassLoaderIsNull() {
+ IntStream.range(0, 100).parallel().forEach(item -> {
+ if (Thread.currentThread().getName().equals("main")) {
+ return;
+ }
+ // in web environment, this could be null, here we just mock a null
class loader.
+ Thread.currentThread().setContextClassLoader(null);
+ TestMgr.check(null, test.postTestStatic(2));
+ });
+ }
+
public static void run() throws Exception {
+ testContextClassLoaderIsNull();
+
smartcare = BeanUtils.getBean("smartcare");
String microserviceName = "pojo";
diff --git
a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/JvmUtils.java
b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/JvmUtils.java
index e2b2b86..48a9baa 100644
---
a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/JvmUtils.java
+++
b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/JvmUtils.java
@@ -50,4 +50,22 @@ public final class JvmUtils {
return null;
}
}
+
+ /**
+ * find a property class loader to avoid null
+ */
+ public static ClassLoader correctClassLoader(ClassLoader classLoader) {
+ ClassLoader targetClassLoader = classLoader;
+ if (targetClassLoader == null) {
+ targetClassLoader = Thread.currentThread().getContextClassLoader();
+ }
+ if (targetClassLoader == null) {
+ targetClassLoader = JvmUtils.class.getClassLoader();
+ }
+ return targetClassLoader;
+ }
+
+ public static ClassLoader findClassLoader() {
+ return correctClassLoader(null);
+ }
}
\ No newline at end of file
diff --git
a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/ConfigMapping.java
b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/ConfigMapping.java
index f29e9af..2c381bb 100644
---
a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/ConfigMapping.java
+++
b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/ConfigMapping.java
@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map;
import org.apache.commons.configuration.Configuration;
+import org.apache.servicecomb.foundation.common.utils.JvmUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,7 +41,7 @@ public final class ConfigMapping {
private static final Logger LOGGER =
LoggerFactory.getLogger(ConfigMapping.class);
static {
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ ClassLoader loader = JvmUtils.findClassLoader();
List<URL> urlList = new ArrayList<>();
configMap = new HashMap<String, Object>();
Enumeration<URL> urls;
diff --git
a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/archaius/sources/AbstractConfigLoader.java
b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/archaius/sources/AbstractConfigLoader.java
index acdde74..fad5959 100644
---
a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/archaius/sources/AbstractConfigLoader.java
+++
b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/archaius/sources/AbstractConfigLoader.java
@@ -25,6 +25,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import org.apache.servicecomb.foundation.common.utils.JvmUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ResourceUtils;
@@ -88,7 +89,7 @@ public abstract class AbstractConfigLoader {
protected List<URL> findURLFromClassPath(String resourceName) throws
IOException {
List<URL> urlList = new ArrayList<>();
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ ClassLoader loader = JvmUtils.findClassLoader();
Enumeration<URL> urls = loader.getResources(resourceName);
while (urls.hasMoreElements()) {
urlList.add(urls.nextElement());
diff --git
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java
index 06ffb9b..b821365 100644
---
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java
+++
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java
@@ -33,6 +33,7 @@ import org.apache.servicecomb.core.exception.ExceptionUtils;
import org.apache.servicecomb.core.provider.consumer.SyncResponseExecutor;
import org.apache.servicecomb.foundation.common.cache.VersionedCache;
import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
+import org.apache.servicecomb.foundation.common.utils.JvmUtils;
import org.apache.servicecomb.loadbalance.filter.CseServerDiscoveryFilter;
import org.apache.servicecomb.loadbalance.filter.IsolationServerListFilter;
import org.apache.servicecomb.loadbalance.filter.TransactionControlFilter;
@@ -365,7 +366,7 @@ public class LoadbalanceHandler implements Handler {
String.format(Configuration.SERVER_LIST_FILTER_CLASS_HOLDER, filter));
if (!StringUtils.isEmpty(className)) {
try {
- Class<?> filterClass = Class.forName(className, true,
Thread.currentThread().getContextClassLoader());
+ Class<?> filterClass = Class.forName(className, true,
JvmUtils.findClassLoader());
if (ServerListFilterExt.class.isAssignableFrom(filterClass)) {
ServerListFilterExt ext = (ServerListFilterExt)
filterClass.newInstance();
ext.setName(filter);
diff --git
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/RuleClassNameExtentionsFactory.java
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/RuleClassNameExtentionsFactory.java
index cc3197e..b6df5ef 100644
---
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/RuleClassNameExtentionsFactory.java
+++
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/RuleClassNameExtentionsFactory.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.loadbalance;
import java.util.Collection;
import org.apache.commons.lang.StringUtils;
+import org.apache.servicecomb.foundation.common.utils.JvmUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@@ -51,7 +52,7 @@ public class RuleClassNameExtentionsFactory implements
ExtensionsFactory {
public IRule createLoadBalancerRule(String ruleName) {
IRule rule;
try {
- rule = (IRule) Class.forName(ruleName, true,
Thread.currentThread().getContextClassLoader()).newInstance();
+ rule = (IRule) Class.forName(ruleName, true,
JvmUtils.findClassLoader()).newInstance();
} catch (InstantiationException | IllegalAccessException |
ClassNotFoundException e) {
LOGGER.warn("Loadbalance rule [{}] is incorrect, using default
RoundRobinRule.", ruleName);
rule = new RoundRobinRule();
diff --git
a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGenerator.java
b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGenerator.java
index 983f86f..aa472fd 100644
---
a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGenerator.java
+++
b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGenerator.java
@@ -30,6 +30,7 @@ import java.util.Set;
import javax.ws.rs.core.MediaType;
+import org.apache.servicecomb.foundation.common.utils.JvmUtils;
import org.springframework.util.StringUtils;
import io.swagger.annotations.Api;
@@ -80,7 +81,7 @@ public class SwaggerGenerator {
this.swagger = new Swagger();
this.context = context;
this.cls = cls;
- this.classLoader = Thread.currentThread().getContextClassLoader();
+ this.classLoader = JvmUtils.findClassLoader();
this.packageName = "gen.swagger";
}
diff --git
a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ClassUtils.java
b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ClassUtils.java
index dbf7905..ae7b7ad 100644
---
a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ClassUtils.java
+++
b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ClassUtils.java
@@ -26,6 +26,7 @@ import javax.lang.model.SourceVersion;
import org.apache.servicecomb.common.javassist.ClassConfig;
import org.apache.servicecomb.common.javassist.JavassistUtils;
+import org.apache.servicecomb.foundation.common.utils.JvmUtils;
import org.apache.servicecomb.swagger.converter.ConverterMgr;
import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator;
import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
@@ -43,9 +44,7 @@ public final class ClassUtils {
}
public static Class<?> getClassByName(ClassLoader classLoader, String
clsName) {
- if (classLoader == null) {
- classLoader = Thread.currentThread().getContextClassLoader();
- }
+ classLoader = JvmUtils.correctClassLoader(classLoader);
try {
return classLoader.loadClass(clsName);
} catch (ClassNotFoundException e) {