|  | @@ -0,0 +1,45 @@
 | 
	
		
			
				|  |  | +package com.xxl.job.admin.core.route.strategy;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import com.xxl.job.admin.core.route.ExecutorRouter;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import java.util.ArrayList;
 | 
	
		
			
				|  |  | +import java.util.LinkedHashMap;
 | 
	
		
			
				|  |  | +import java.util.concurrent.ConcurrentHashMap;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * 单个JOB对应的每个执行器,最久为使用的优先被选举
 | 
	
		
			
				|  |  | + *      a、LFU(Least Frequently Used):最不经常使用,频率/次数
 | 
	
		
			
				|  |  | + *      b(*)、LRU(Least Recently Used):最近最久未使用,时间
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Created by xuxueli on 17/3/10.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +public class ExecutorRouteLRU extends ExecutorRouter {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private static ConcurrentHashMap<Integer, LinkedHashMap<String, String>> jobLRUMap = new ConcurrentHashMap<Integer, LinkedHashMap<String, String>>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public String route(int jobId, ArrayList<String> addressList) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        LinkedHashMap<String, String> lruItem = jobLRUMap.get(jobId);
 | 
	
		
			
				|  |  | +        if (lruItem == null) {
 | 
	
		
			
				|  |  | +            /**
 | 
	
		
			
				|  |  | +             * LinkedHashMap
 | 
	
		
			
				|  |  | +             *      a、accessOrder:ture=访问顺序排序(get/put时排序);false=插入顺序排期;
 | 
	
		
			
				|  |  | +             *      b、removeEldestEntry:新增元素时将会调用,返回true时会删除最老元素;可封装LinkedHashMap并重写该方法,比如定义最大容量,超出是返回true即可实现固定长度的LRU算法;
 | 
	
		
			
				|  |  | +             */
 | 
	
		
			
				|  |  | +            lruItem = new LinkedHashMap<>(16, 0.75f, true);
 | 
	
		
			
				|  |  | +            jobLRUMap.put(jobId, lruItem);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        for (String address: addressList) {
 | 
	
		
			
				|  |  | +            if (!lruItem.containsKey(address)) {
 | 
	
		
			
				|  |  | +                lruItem.put(address, address);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        String eldestKey = lruItem.entrySet().iterator().next().getKey();
 | 
	
		
			
				|  |  | +        String eldestValue = lruItem.get(eldestKey);
 | 
	
		
			
				|  |  | +        return eldestValue;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 |