335ac2f5f9314e3430432cf3836422a401a4c8a5.svn-base 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package com.xxl.job.admin.core.route.strategy;
  2. import com.xxl.job.admin.core.route.ExecutorRouter;
  3. import com.xxl.job.core.biz.model.ReturnT;
  4. import com.xxl.job.core.biz.model.TriggerParam;
  5. import java.util.ArrayList;
  6. import java.util.LinkedHashMap;
  7. import java.util.List;
  8. import java.util.concurrent.ConcurrentHashMap;
  9. import java.util.concurrent.ConcurrentMap;
  10. /**
  11. * 单个JOB对应的每个执行器,最久为使用的优先被选举
  12. * a、LFU(Least Frequently Used):最不经常使用,频率/次数
  13. * b(*)、LRU(Least Recently Used):最近最久未使用,时间
  14. *
  15. * Created by xuxueli on 17/3/10.
  16. */
  17. public class ExecutorRouteLRU extends ExecutorRouter {
  18. private static ConcurrentMap<Integer, LinkedHashMap<String, String>> jobLRUMap = new ConcurrentHashMap<Integer, LinkedHashMap<String, String>>();
  19. private static long CACHE_VALID_TIME = 0;
  20. public String route(int jobId, List<String> addressList) {
  21. // cache clear
  22. if (System.currentTimeMillis() > CACHE_VALID_TIME) {
  23. jobLRUMap.clear();
  24. CACHE_VALID_TIME = System.currentTimeMillis() + 1000*60*60*24;
  25. }
  26. // init lru
  27. LinkedHashMap<String, String> lruItem = jobLRUMap.get(jobId);
  28. if (lruItem == null) {
  29. /**
  30. * LinkedHashMap
  31. * a、accessOrder:true=访问顺序排序(get/put时排序);false=插入顺序排期;
  32. * b、removeEldestEntry:新增元素时将会调用,返回true时会删除最老元素;可封装LinkedHashMap并重写该方法,比如定义最大容量,超出是返回true即可实现固定长度的LRU算法;
  33. */
  34. lruItem = new LinkedHashMap<String, String>(16, 0.75f, true);
  35. jobLRUMap.putIfAbsent(jobId, lruItem);
  36. }
  37. // put new
  38. for (String address: addressList) {
  39. if (!lruItem.containsKey(address)) {
  40. lruItem.put(address, address);
  41. }
  42. }
  43. // remove old
  44. List<String> delKeys = new ArrayList<>();
  45. for (String existKey: lruItem.keySet()) {
  46. if (!addressList.contains(existKey)) {
  47. delKeys.add(existKey);
  48. }
  49. }
  50. if (delKeys.size() > 0) {
  51. for (String delKey: delKeys) {
  52. lruItem.remove(delKey);
  53. }
  54. }
  55. // load
  56. String eldestKey = lruItem.entrySet().iterator().next().getKey();
  57. String eldestValue = lruItem.get(eldestKey);
  58. return eldestValue;
  59. }
  60. @Override
  61. public ReturnT<String> route(TriggerParam triggerParam, List<String> addressList) {
  62. String address = route(triggerParam.getJobId(), addressList);
  63. return new ReturnT<String>(address);
  64. }
  65. }