This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.0 by this push:
new a78bdc8998 [3.0] Handle interrupted exception for ExtensionLoader
(#10194)
a78bdc8998 is described below
commit a78bdc8998eaa6240f8c40716f5d1fcbfcb2cdab
Author: Albumen Kevin <[email protected]>
AuthorDate: Fri Jun 24 14:27:36 2022 +0800
[3.0] Handle interrupted exception for ExtensionLoader (#10194)
---
.../apache/dubbo/common/extension/ExtensionLoader.java | 15 +++++++++++----
.../dubbo/common/utils/ClassLoaderResourceLoader.java | 8 ++------
.../dubbo/common/utils/ClassLoaderResourceLoaderTest.java | 2 +-
3 files changed, 14 insertions(+), 11 deletions(-)
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
index 2445156ca0..a170f3684c 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
@@ -909,7 +909,12 @@ public class ExtensionLoader<T> {
synchronized (cachedClasses) {
classes = cachedClasses.get();
if (classes == null) {
- classes = loadExtensionClasses();
+ try {
+ classes = loadExtensionClasses();
+ } catch (InterruptedException e) {
+ logger.error("Exception occurred when loading
extension class (interface: " + type + ")", e);
+ throw new IllegalStateException("Exception occurred
when loading extension class (interface: " + type + ")", e);
+ }
cachedClasses.set(classes);
}
}
@@ -921,7 +926,7 @@ public class ExtensionLoader<T> {
* synchronized in getExtensionClasses
*/
@SuppressWarnings("deprecation")
- private Map<String, Class<?>> loadExtensionClasses() {
+ private Map<String, Class<?>> loadExtensionClasses() throws
InterruptedException {
checkDestroyed();
cacheDefaultExtensionName();
@@ -939,7 +944,7 @@ public class ExtensionLoader<T> {
return extensionClasses;
}
- private void loadDirectory(Map<String, Class<?>> extensionClasses,
LoadingStrategy strategy, String type) {
+ private void loadDirectory(Map<String, Class<?>> extensionClasses,
LoadingStrategy strategy, String type) throws InterruptedException {
loadDirectoryInternal(extensionClasses, strategy, type);
try {
String oldType = type.replace("org.apache", "com.alibaba");
@@ -976,7 +981,7 @@ public class ExtensionLoader<T> {
}
}
- private void loadDirectoryInternal(Map<String, Class<?>> extensionClasses,
LoadingStrategy loadingStrategy, String type) {
+ private void loadDirectoryInternal(Map<String, Class<?>> extensionClasses,
LoadingStrategy loadingStrategy, String type) throws InterruptedException {
String fileName = loadingStrategy.directory() + type;
try {
List<ClassLoader> classLoadersToLoad = new LinkedList<>();
@@ -1024,6 +1029,8 @@ public class ExtensionLoader<T> {
loadingStrategy.excludedPackages(),
loadingStrategy.onlyExtensionClassLoaderPackages());
}));
+ } catch (InterruptedException e) {
+ throw e;
} catch (Throwable t) {
logger.error("Exception occurred when loading extension class
(interface: " +
type + ", description file: " + fileName + ").", t);
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ClassLoaderResourceLoader.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ClassLoaderResourceLoader.java
index 8266938e94..cd1a95df02 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ClassLoaderResourceLoader.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ClassLoaderResourceLoader.java
@@ -42,7 +42,7 @@ public class ClassLoaderResourceLoader {
GlobalResourcesRepository.registerGlobalDisposable(()-> destroy());
}
- public static Map<ClassLoader, Set<URL>> loadResources(String fileName,
List<ClassLoader> classLoaders) {
+ public static Map<ClassLoader, Set<URL>> loadResources(String fileName,
List<ClassLoader> classLoaders) throws InterruptedException {
Map<ClassLoader, Set<URL>> resources = new ConcurrentHashMap<>();
CountDownLatch countDownLatch = new
CountDownLatch(classLoaders.size());
for (ClassLoader classLoader : classLoaders) {
@@ -51,11 +51,7 @@ public class ClassLoaderResourceLoader {
countDownLatch.countDown();
});
}
- try {
- countDownLatch.await();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
+ countDownLatch.await();
return Collections.unmodifiableMap(new LinkedHashMap<>(resources));
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ClassLoaderResourceLoaderTest.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ClassLoaderResourceLoaderTest.java
index 45921031ab..efcfdbf783 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ClassLoaderResourceLoaderTest.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ClassLoaderResourceLoaderTest.java
@@ -34,7 +34,7 @@ import java.util.Set;
public class ClassLoaderResourceLoaderTest {
@Test
- public void test() {
+ public void test() throws InterruptedException {
DubboInternalLoadingStrategy dubboInternalLoadingStrategy = new
DubboInternalLoadingStrategy();
String directory = dubboInternalLoadingStrategy.directory();
String type = FooAppProvider.class.getName();