refactor(route):优化执行器路由策略实现

- 使用 StandardCharsets.UTF_8 替代手动指定 UTF-8 编码
- 移除不必要的异常捕获和抛出逻辑- 将 VIRTUAL_NODE_NUM 常量声明为 final- 优化 LFU 路由策略中的排序逻辑,使用 Map.Entry.comparingByValue()- 简化 LRU 路由策略中的元素加载逻辑
- 统一集合初始化时的泛型声明方式
-优化空集合判断逻辑,使用 isEmpty() 替代 size() 比较- 完善类字段和方法的 javadoc 注释内容
pull/72/head
xuxueli 2 months ago
parent 09cd4828fe
commit 89563da2ac

@ -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;
* JOBJOBJOB
* avirtual node
* bhash method replace hashCodeStringhashCodehashCode
*
* 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 (md5hash)
* @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<String> addressList) {
// ------A1------A2-------A3------

@ -17,6 +17,11 @@ import java.util.concurrent.ConcurrentMap;
*/
public class ExecutorRouteLFU extends ExecutorRouter {
/**
* job lfu map
*
* <jobId, <address, count>>
*/
private static ConcurrentMap<Integer, HashMap<String, Integer>> jobLfuMap = new ConcurrentHashMap<Integer, HashMap<String, Integer>>();
private static long CACHE_VALID_TIME = 0;
@ -31,7 +36,7 @@ public class ExecutorRouteLFU extends ExecutorRouter {
// lfu item init
HashMap<String, Integer> lfuItemMap = jobLfuMap.get(jobId); // Key排序可以用TreeMap+构造入参CompareValue排序暂时只能通过ArrayList
if (lfuItemMap == null) {
lfuItemMap = new HashMap<String, Integer>();
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<Map.Entry<String, Integer>> lfuItemList = new ArrayList<Map.Entry<String, Integer>>(lfuItemMap.entrySet());
Collections.sort(lfuItemList, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
List<Map.Entry<String, Integer>> lfuItemList = new ArrayList<>(lfuItemMap.entrySet());
lfuItemList.sort(Map.Entry.comparingByValue()); // 默认升序, 获取 Value 最小值
Map.Entry<String, Integer> addressItem = lfuItemList.get(0);
String minAddress = addressItem.getKey();
addressItem.setValue(addressItem.getValue() + 1);
return addressItem.getKey();

@ -19,6 +19,11 @@ import java.util.concurrent.ConcurrentMap;
*/
public class ExecutorRouteLRU extends ExecutorRouter {
/**
* job lru map
*
* <jobId, <address, address>>
*/
private static ConcurrentMap<Integer, LinkedHashMap<String, String>> jobLRUMap = new ConcurrentHashMap<Integer, LinkedHashMap<String, String>>();
private static long CACHE_VALID_TIME = 0;
@ -38,7 +43,7 @@ public class ExecutorRouteLRU extends ExecutorRouter {
* aaccessOrdertrue=访get/putfalse=
* bremoveEldestEntrytrueLinkedHashMaptrueLRU
*/
lruItem = new LinkedHashMap<String, String>(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

Loading…
Cancel
Save