mirror of
https://github.com/alibaba/arthas.git
synced 2026-10-21 03:30:08 +00:00
extract common function: ResultUtils.processClassNames
This commit is contained in:
+12
-20
@@ -8,6 +8,7 @@ import com.taobao.arthas.core.shell.command.AnnotatedCommand;
|
||||
import com.taobao.arthas.core.shell.command.CommandProcess;
|
||||
import com.taobao.arthas.core.shell.handlers.Handler;
|
||||
import com.taobao.arthas.core.util.ClassUtils;
|
||||
import com.taobao.arthas.core.util.ResultUtils;
|
||||
import com.taobao.arthas.core.util.affect.RowAffect;
|
||||
import com.taobao.middleware.cli.annotations.Description;
|
||||
import com.taobao.middleware.cli.annotations.Name;
|
||||
@@ -304,8 +305,8 @@ public class ClassLoaderCommand extends AnnotatedCommand {
|
||||
}
|
||||
|
||||
//convert to vo
|
||||
int sizeLimit = 512;
|
||||
processClassSet(process, ClassUtils.createClassLoaderVO(null), bootstrapClassSet, sizeLimit);
|
||||
int pageSize = 256;
|
||||
processClassSet(process, ClassUtils.createClassLoaderVO(null), bootstrapClassSet, pageSize);
|
||||
affect.rCnt(bootstrapClassSet.size());
|
||||
|
||||
for (Entry<ClassLoader, SortedSet<Class>> entry : classLoaderClassMap.entrySet()) {
|
||||
@@ -314,29 +315,20 @@ public class ClassLoaderCommand extends AnnotatedCommand {
|
||||
}
|
||||
ClassLoader classLoader = entry.getKey();
|
||||
SortedSet<Class> classSet = entry.getValue();
|
||||
processClassSet(process, ClassUtils.createClassLoaderVO(classLoader), classSet, sizeLimit);
|
||||
processClassSet(process, ClassUtils.createClassLoaderVO(classLoader), classSet, pageSize);
|
||||
affect.rCnt(classSet.size());
|
||||
}
|
||||
}
|
||||
|
||||
private void processClassSet(CommandProcess process, ClassLoaderVO classLoaderVO, Collection<Class> classes, int sizeLimit) {
|
||||
List<String> classNames = new ArrayList<String>(512);
|
||||
int segment = 0;
|
||||
for (Class aClass : classes) {
|
||||
classNames.add(aClass.getName());
|
||||
//slice segment
|
||||
if(classNames.size() >= sizeLimit) {
|
||||
if (checkInterrupted(process)) {
|
||||
return;
|
||||
}
|
||||
process.appendResult(new ClassLoaderModel().setClassSet(new ClassSetVO(classLoaderVO, classNames, segment++)));
|
||||
classNames = new ArrayList<String>(512);
|
||||
private void processClassSet(final CommandProcess process, final ClassLoaderVO classLoaderVO, Collection<Class> classes, int pageSize) {
|
||||
|
||||
ResultUtils.processClassNames(classes, pageSize, new ResultUtils.PaginationHandler<List<String>>() {
|
||||
@Override
|
||||
public boolean handle(List<String> classNames, int segment) {
|
||||
process.appendResult(new ClassLoaderModel().setClassSet(new ClassSetVO(classLoaderVO, classNames, segment)));
|
||||
return !checkInterrupted(process);
|
||||
}
|
||||
}
|
||||
//last segment
|
||||
if (classNames.size() > 0) {
|
||||
process.appendResult(new ClassLoaderModel().setClassSet(new ClassSetVO(classLoaderVO, classNames, segment++)));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static List<String> getClassLoaderUrls(ClassLoader classLoader) {
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.taobao.arthas.core.util;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 命令结果处理工具类
|
||||
* @author gongdewei 2020/5/18
|
||||
*/
|
||||
public class ResultUtils {
|
||||
|
||||
/**
|
||||
* 分页处理class列表,转换为className列表
|
||||
* @param classes
|
||||
* @param pageSize
|
||||
* @param handler
|
||||
*/
|
||||
public static void processClassNames(Collection<Class> classes, int pageSize, PaginationHandler<List<String>> handler) {
|
||||
List<String> classNames = new ArrayList<String>(pageSize);
|
||||
int segment = 0;
|
||||
for (Class aClass : classes) {
|
||||
classNames.add(aClass.getName());
|
||||
//slice segment
|
||||
if(classNames.size() >= pageSize) {
|
||||
handler.handle(classNames, segment++);
|
||||
classNames = new ArrayList<String>(pageSize);
|
||||
}
|
||||
}
|
||||
//last segment
|
||||
if (classNames.size() > 0) {
|
||||
handler.handle(classNames, segment++);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页数据处理回调接口
|
||||
* @param <T>
|
||||
*/
|
||||
public interface PaginationHandler<T> {
|
||||
|
||||
/**
|
||||
* 处理分页数据
|
||||
* @param list
|
||||
* @param segment
|
||||
* @return true 继续处理剩余数据, false 终止处理
|
||||
*/
|
||||
boolean handle(T list, int segment);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user