extract common function: ResultUtils.processClassNames

This commit is contained in:
gongdewei
2020-05-19 10:41:19 +08:00
parent 410df5b7c2
commit 3fc3739a3f
2 changed files with 62 additions and 20 deletions
@@ -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);
}
}