CachingFlowManager这部分为Azkaban在管理job中cache管理这一部分。
public CachingFlowManager(FlowManager baseManager, final int cacheSize) { this.baseManager = baseManager; this.flowCache = Collections.synchronizedMap( new LinkedHashMap<String, FlowExecutionHolder>((int) (cacheSize * 1.5), 0.75f, true){ @Override protected boolean removeEldestEntry(Map.Entry<String, FlowExecutionHolder> eldest) { final boolean tooManyElements = super.size() > cacheSize; if (tooManyElements) { final Status status = eldest.getValue().getFlow().getStatus(); if (status != Status.RUNNING) { return true; } else { log.warn(String.format( "Cache is at size[%s] and should have evicted an entry, but the oldest entry wasn't completed[%s]. Perhaps the cache size is too small", super.size(), status )); } } return false; } } ); }
在这个方法中涉及到几个地方是之前没有学习到过、也没有遇到过的。下面都一一来研究下。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、Collections.synchronizedMap
接下来synchronizedMap
顾名思义,synchronize是同步,那则为同步的map。
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)这是一个返回由指定映射支持的同步(线程安全的)映射的方法。也就是返回一个线程安全的map
2、new LinkedHashMap<String, FlowExecutionHolder>((int) (cacheSize * 1.5), 0.75f, true)
LinkedHashMap是JDK1.4引入的新的集合类,相信很多人都没有用到过LinkedHashMap。
LinkedHashMap相当于是一个对HashMap的扩展,它在Hash的实现有加上了对Linked的支持。
在我们平常使用的时候几乎所有情况下都会使用这些集合类无参的构造方法进行创建对象,那在这里那三个参数又是什么含义呢?
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor); this.accessOrder = accessOrder; }a、initialCapacity : 代表该LinkedHashMap的初始化容量
b、loadFactor : 代表LinkedHashMap的加载因子,加载因子与LinkedHashMap resize有关。默认为0.75f
c、accessOrder : 排序方式。true是按照最久使用到最近使用的顺序, false是插入式排序
在这里传入的参数为最旧的条目,在方法中要进行判断这个条目是否需要从cache被移除。
Azkaban中判定的方法为,(前提是cache已满)如果最旧的job已不在运行,则将最旧的job移出cache,否则不进行操作。
注: 本文是由本人原创,如需引用请注明出处:http://blog.csdn.net/zhang__bing/article/details/8722072