From 3fc3739a3f9fbad12ef5facd08f24fb34f98b399 Mon Sep 17 00:00:00 2001 From: gongdewei Date: Tue, 19 May 2020 10:41:19 +0800 Subject: [PATCH] extract common function: ResultUtils.processClassNames --- .../command/klass100/ClassLoaderCommand.java | 32 +++++------- .../taobao/arthas/core/util/ResultUtils.java | 50 +++++++++++++++++++ 2 files changed, 62 insertions(+), 20 deletions(-) create mode 100644 core/src/main/java/com/taobao/arthas/core/util/ResultUtils.java diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/ClassLoaderCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/ClassLoaderCommand.java index fc76f0477..4f0c6fb63 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/ClassLoaderCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/ClassLoaderCommand.java @@ -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> entry : classLoaderClassMap.entrySet()) { @@ -314,29 +315,20 @@ public class ClassLoaderCommand extends AnnotatedCommand { } ClassLoader classLoader = entry.getKey(); SortedSet 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 classes, int sizeLimit) { - List classNames = new ArrayList(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(512); + private void processClassSet(final CommandProcess process, final ClassLoaderVO classLoaderVO, Collection classes, int pageSize) { + + ResultUtils.processClassNames(classes, pageSize, new ResultUtils.PaginationHandler>() { + @Override + public boolean handle(List 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 getClassLoaderUrls(ClassLoader classLoader) { diff --git a/core/src/main/java/com/taobao/arthas/core/util/ResultUtils.java b/core/src/main/java/com/taobao/arthas/core/util/ResultUtils.java new file mode 100644 index 000000000..9974990f6 --- /dev/null +++ b/core/src/main/java/com/taobao/arthas/core/util/ResultUtils.java @@ -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 classes, int pageSize, PaginationHandler> handler) { + List classNames = new ArrayList(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(pageSize); + } + } + //last segment + if (classNames.size() > 0) { + handler.handle(classNames, segment++); + } + } + + /** + * 分页数据处理回调接口 + * @param + */ + public interface PaginationHandler { + + /** + * 处理分页数据 + * @param list + * @param segment + * @return true 继续处理剩余数据, false 终止处理 + */ + boolean handle(T list, int segment); + } +}