From 89563da2ac9afea3d1a2cbb132b62fd19fbcbf7f Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Sat, 25 Oct 2025 02:06:02 +0800 Subject: [PATCH] =?UTF-8?q?refactor(route):=E4=BC=98=E5=8C=96=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=99=A8=E8=B7=AF=E7=94=B1=E7=AD=96=E7=95=A5=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用 StandardCharsets.UTF_8 替代手动指定 UTF-8 编码 - 移除不必要的异常捕获和抛出逻辑- 将 VIRTUAL_NODE_NUM 常量声明为 final- 优化 LFU 路由策略中的排序逻辑,使用 Map.Entry.comparingByValue()- 简化 LRU 路由策略中的元素加载逻辑 - 统一集合初始化时的泛型声明方式 -优化空集合判断逻辑,使用 isEmpty() 替代 size() 比较- 完善类字段和方法的 javadoc 注释内容 --- .../strategy/ExecutorRouteConsistentHash.java | 26 +++++++++++-------- .../route/strategy/ExecutorRouteLFU.java | 19 +++++++------- .../route/strategy/ExecutorRouteLRU.java | 14 ++++++---- 3 files changed, 33 insertions(+), 26 deletions(-) diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteConsistentHash.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteConsistentHash.java index 47612781..ececfab5 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteConsistentHash.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteConsistentHash.java @@ -4,7 +4,7 @@ import com.xxl.job.admin.scheduler.route.ExecutorRouter; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; -import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.List; @@ -15,16 +15,18 @@ import java.util.TreeMap; * 分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器; * a、virtual node:解决不均衡问题 * b、hash method replace hashCode:String的hashCode可能重复,需要进一步扩大hashCode的取值范围 + * * Created by xuxueli on 17/3/10. */ public class ExecutorRouteConsistentHash extends ExecutorRouter { - private static int VIRTUAL_NODE_NUM = 100; + private static final int VIRTUAL_NODE_NUM = 100; /** * get hash code on 2^32 ring (md5散列的方式计算hash值) - * @param key - * @return + * + * @param key key + * @return hash code */ private static long hash(String key) { @@ -37,11 +39,7 @@ public class ExecutorRouteConsistentHash extends ExecutorRouter { } md5.reset(); byte[] keyBytes = null; - try { - keyBytes = key.getBytes("UTF-8"); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException("Unknown string :" + key, e); - } + keyBytes = key.getBytes(StandardCharsets.UTF_8); md5.update(keyBytes); byte[] digest = md5.digest(); @@ -52,10 +50,16 @@ public class ExecutorRouteConsistentHash extends ExecutorRouter { | ((long) (digest[1] & 0xFF) << 8) | (digest[0] & 0xFF); - long truncateHashCode = hashCode & 0xffffffffL; - return truncateHashCode; + return hashCode & 0xffffffffL; } + /** + * get address by jobId + * + * @param jobId job id + * @param addressList address list + * @return address + */ public String hashJob(int jobId, List addressList) { // ------A1------A2-------A3------ diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteLFU.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteLFU.java index d17ace42..1fddd901 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteLFU.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteLFU.java @@ -17,6 +17,11 @@ import java.util.concurrent.ConcurrentMap; */ public class ExecutorRouteLFU extends ExecutorRouter { + /** + * job lfu map + * + * > + */ private static ConcurrentMap> jobLfuMap = new ConcurrentHashMap>(); private static long CACHE_VALID_TIME = 0; @@ -31,7 +36,7 @@ public class ExecutorRouteLFU extends ExecutorRouter { // lfu item init HashMap lfuItemMap = jobLfuMap.get(jobId); // Key排序可以用TreeMap+构造入参Compare;Value排序暂时只能通过ArrayList; if (lfuItemMap == null) { - lfuItemMap = new HashMap(); + lfuItemMap = new HashMap<>(); jobLfuMap.putIfAbsent(jobId, lfuItemMap); // 避免重复覆盖 } @@ -48,23 +53,17 @@ public class ExecutorRouteLFU extends ExecutorRouter { delKeys.add(existKey); } } - if (delKeys.size() > 0) { + if (!delKeys.isEmpty()) { for (String delKey: delKeys) { lfuItemMap.remove(delKey); } } // load least userd count address - List> lfuItemList = new ArrayList>(lfuItemMap.entrySet()); - Collections.sort(lfuItemList, new Comparator>() { - @Override - public int compare(Map.Entry o1, Map.Entry o2) { - return o1.getValue().compareTo(o2.getValue()); - } - }); + List> lfuItemList = new ArrayList<>(lfuItemMap.entrySet()); + lfuItemList.sort(Map.Entry.comparingByValue()); // 默认升序, 获取 Value 最小值 Map.Entry addressItem = lfuItemList.get(0); - String minAddress = addressItem.getKey(); addressItem.setValue(addressItem.getValue() + 1); return addressItem.getKey(); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteLRU.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteLRU.java index 602ae5d3..6221dc57 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteLRU.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteLRU.java @@ -19,6 +19,11 @@ import java.util.concurrent.ConcurrentMap; */ public class ExecutorRouteLRU extends ExecutorRouter { + /** + * job lru map + * + * > + */ private static ConcurrentMap> jobLRUMap = new ConcurrentHashMap>(); private static long CACHE_VALID_TIME = 0; @@ -38,7 +43,7 @@ public class ExecutorRouteLRU extends ExecutorRouter { * a、accessOrder:true=访问顺序排序(get/put时排序);false=插入顺序排期; * b、removeEldestEntry:新增元素时将会调用,返回true时会删除最老元素;可封装LinkedHashMap并重写该方法,比如定义最大容量,超出是返回true即可实现固定长度的LRU算法; */ - lruItem = new LinkedHashMap(16, 0.75f, true); + lruItem = new LinkedHashMap<>(16, 0.75f, true); jobLRUMap.putIfAbsent(jobId, lruItem); } @@ -55,16 +60,15 @@ public class ExecutorRouteLRU extends ExecutorRouter { delKeys.add(existKey); } } - if (delKeys.size() > 0) { + if (!delKeys.isEmpty()) { for (String delKey: delKeys) { lruItem.remove(delKey); } } - // load + // load first elment, eldest entry String eldestKey = lruItem.entrySet().iterator().next().getKey(); - String eldestValue = lruItem.get(eldestKey); - return eldestValue; + return lruItem.get(eldestKey); } @Override