插件依赖类使用异步方式加载,解决主流程加载慢问题
This commit is contained in:
@@ -43,9 +43,7 @@ public class DynamicJarClassLoader extends URLClassLoader {
|
||||
public void unload() {
|
||||
CoolPreconditions.check(lock, "异步加载任务还未完成,请稍后重试......");
|
||||
lock = true;
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
new Thread(() -> {
|
||||
try {
|
||||
for (Map.Entry<String, Class<?>> entry : loadedClasses.entrySet()) {
|
||||
// 从已加载的类集合中移除该类
|
||||
@@ -59,7 +57,6 @@ public class DynamicJarClassLoader extends URLClassLoader {
|
||||
} finally{
|
||||
lock = false;
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
public void loadClass(List<JarEntry> jarEntries, List<Class<?>> plugins) {
|
||||
@@ -98,13 +95,11 @@ public class DynamicJarClassLoader extends URLClassLoader {
|
||||
/**
|
||||
* 异步加载
|
||||
*/
|
||||
public void asyncLoadClass(List<JarEntry> list) {
|
||||
public void asyncLoadClass(String key, List<JarEntry> list) {
|
||||
CoolPreconditions.check(lock, "异步加载任务还未完成,请稍后重试......");
|
||||
lock = true;
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
log.info("开始异步加载....");
|
||||
new Thread(() -> {
|
||||
log.info("开始异步加载插件{}依赖类....", key);
|
||||
Instant start = Instant.now();
|
||||
int size = list.size();
|
||||
int currentProgress = 0;
|
||||
@@ -118,17 +113,16 @@ public class DynamicJarClassLoader extends URLClassLoader {
|
||||
int progress = (int) ((count / (double) size) * 100);
|
||||
// 输出一次进度
|
||||
if (progress % progressThreshold == 0 && currentProgress != progress) {
|
||||
log.info("异步加载进度: {}%", progress);
|
||||
log.info("插件{}依赖类异步加载进度: {}%", key, progress);
|
||||
currentProgress = progress;
|
||||
}
|
||||
}
|
||||
} finally{
|
||||
Instant end = Instant.now();
|
||||
Duration timeElapsed = Duration.between(start, end);
|
||||
log.info("异步加载完成本次共加载{}个文件 耗时: {}ms", count, timeElapsed.toMillis());
|
||||
log.info("异步加载插件{}依赖类完成,共加载{}个文件 耗时: {}ms", key, count, timeElapsed.toMillis());
|
||||
lock = false;
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
@@ -48,7 +48,7 @@ public class DynamicJarLoaderService {
|
||||
// 历史如果有安装过,先卸载
|
||||
uninstall(pluginJson.getKey());
|
||||
// 加载class
|
||||
List<Class<?>> plugins = loadClass(jarUrl, dynamicJarClassLoader);
|
||||
List<Class<?>> plugins = loadClass(pluginJson.getKey(), jarUrl, dynamicJarClassLoader);
|
||||
// 校验插件
|
||||
checkPlugin(plugins);
|
||||
// 注册插件,目前一个插件包,只允许有一个插件入口
|
||||
@@ -59,7 +59,7 @@ public class DynamicJarLoaderService {
|
||||
/**
|
||||
* 加载class
|
||||
*/
|
||||
private static List<Class<?>> loadClass(URL jarUrl,
|
||||
private static List<Class<?>> loadClass(String key, URL jarUrl,
|
||||
DynamicJarClassLoader dynamicJarClassLoader) throws IOException {
|
||||
// 加载类
|
||||
List<Class<?>> plugins = new ArrayList<>();
|
||||
@@ -69,7 +69,7 @@ public class DynamicJarLoaderService {
|
||||
// 先加载前100个类,主够包含了插件主类,其余的异步加载
|
||||
dynamicJarClassLoader.loadClass(firstNElements, plugins);
|
||||
// 异步加载插件依赖类
|
||||
dynamicJarClassLoader.asyncLoadClass(list);
|
||||
dynamicJarClassLoader.asyncLoadClass(key, list);
|
||||
}
|
||||
return plugins;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user