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
先來看下在JDK中對Collections的解釋:
接下來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是插入式排序
3、
在這裡傳入的參數為最舊的條目,在方法中要進行判斷這個條目是否需要從cache被移除。
Azkaban中判定的方法為,(前提是cache已滿)如果最舊的job已不在運行,則將最舊的job移出cache,否則不進行操作。
註: 本文是由本人原創,如需引用請註明出處:http://blog.csdn.net/zhang__bing/article/details/8722072