本博客屬原創(chuàng )文章,歡迎轉載!轉載請務(wù)必注明出處:http://guoyunsky.javaeye.com/blog/650694
歡迎加入Heritrix群(QQ):10447185
CrawlController的確是Heritrix的大腦,在Heritrix中擁有無(wú)上的權利!可以控制Heritrix的啟動(dòng)、暫停、停止,也定時(shí)進(jìn)行數據統計、數據匯報和文件管理。同時(shí)CrawlController也基本上貫穿整個(gè)Heritrix代碼,和CrawlURI一樣。同時(shí)CrawlController純代碼頁(yè)進(jìn)2000行,下面就先介紹里面的屬性和主要方法,同時(shí)對一些靈活用法也加以介紹:
1.屬性:
//狀態(tài),Checkpoinging:表示正在備份private static final Object CHECKPOINTING = "CHECKPOINTING".intern();//狀態(tài),FINISHED:表示抓取結束private static final Object FINISHED = "FINISHED".intern();//狀態(tài),NASCENT:表示正在生成一個(gè)JOBprivate static final Object NASCENT = "NASCENT".intern();//狀態(tài),PAUSED:表示暫停結束,該狀態(tài)Heritrix正暫停任何抓取private static final Object PAUSED = "PAUSED".intern();//狀態(tài),PAUSING:表示正在暫停,傳達一個(gè)暫停命令到每一個(gè)線(xiàn)程暫停中間需要時(shí)間private static final Object PAUSING = "PAUSING".intern();//狀態(tài),PREPARING:表示抓取結束private static final Object PREPARING = "PREPARING".intern();//狀態(tài),RUNNING:表示正在運行private static final Object RUNNING = "RUNNING".intern();//狀態(tài),STARTED:表示已經(jīng)啟動(dòng)private static final Object STARTED = "STARTED".intern();//狀態(tài),STOPPING:表示正在停止,傳達一個(gè)停止命令到每一個(gè)線(xiàn)程暫停中間需要時(shí)間private static final Object STOPPING = "STOPPING".intern();//當前類(lèi)的日志管理器private final static Logger LOGGER = Logger.getLogger(CrawlController.class.getName());// 活動(dòng)的日志文件名后綴public static final String CURRENT_LOG_SUFFIX = ".log";// 日志crawl.log.txt的文件名private static final String LOGNAME_CRAWL = "crawl";// 日志local-errors.log.txt的文件名private static final String LOGNAME_LOCAL_ERRORS = "local-errors";// 日志progress-statistics.log.txt的文件名private static final String LOGNAME_PROGRESS_STATISTICS = "progress-statistics";// runtime-errors.txt的文件名private static final String LOGNAME_RUNTIME_ERRORS = "runtime-errors";// 日志uri-errors.txt的文件名private static final String LOGNAME_URI_ERRORS = "uri-errors";// 日志manifest-report的文件名前綴public final static String MANIFEST_REPORT = "manifest";//processors-report.txt的文件名前綴public final static String PROCESSORS_REPORT = "processors";// crawl-manifest日志文件中中配置文件標簽縮寫(xiě)public static final char MANIFEST_CONFIG_FILE = 'C';// crawl-manifest日志文件中中日志文件標簽縮寫(xiě)public static final char MANIFEST_LOG_FILE = 'L';// crawl-manifest日志文件中中報告文件標簽縮寫(xiě)public static final char MANIFEST_REPORT_FILE = 'R';//報告文件名數組protected final static String[] REPORTS = { PROCESSORS_REPORT,MANIFEST_REPORT };//應急內存,當內存不夠時(shí)Heritrix會(huì )釋放這個(gè)內存去做一些緊急動(dòng)作如數據備份private static final int RESERVE_BLOCK_SIZE = 6 * 2 ^ 20; // 6MBprivate static final int RESERVE_BLOCKS = 1;//BDB數據庫,Heritrix自己封裝private transient EnhancedEnvironment bdbEnvironment = null;//用于Checkpoint備份,存儲需要備份的數據private transient Map<String, CachedBdbMap<?, ?>> bigmaps = null;//備份器private Checkpointer checkpointer;//備份對象private transient Checkpoint checkpointRecover = null;//備份目錄private transient File checkpointsDisk;//整個(gè)Heritrix目錄private transient File disk;//日志文件目錄private transient File logsDisk;//scratch文件private transient File scratchDisk;//BDB數據庫文件private transient File stateDisk;//日志處理器跟文件處理器關(guān)聯(lián)transient private Map<Logger, FileHandler> fileHandlers;//調度器private transient Frontier frontier;// 日志處理器,關(guān)聯(lián)local-errors.logpublic transient Logger localErrors;// 日志處理器,關(guān)聯(lián) progress-statistics.logprivate transient Logger progressStats;//日志處理器,關(guān)聯(lián)報告文件public transient Logger reports;// 日志處理器,關(guān)聯(lián)runtime-errors.logpublic transient Logger runtimeErrors;// 日志處理器,關(guān)聯(lián)uri-Errors.logpublic transient Logger uriErrors;// 日志處理器,關(guān)聯(lián)crawl.logpublic transient Logger uriProcessing;//記錄Hertrix創(chuàng )建的日志文件名private StringBuffer manifest;//最大字節數,來(lái)源于配置文件private long maxBytes; ////抓取限制, 最大文檔數,來(lái)源于配置文件private long maxDocument;// 抓取限制,最大時(shí)間,來(lái)源于配置文件private long maxTime;//管理order.xmlprivate transient CrawlOrder order;//處理器鏈private transient ProcessorChainList processorChains;//事件監聽(tīng)器,比如正在運行、停止private transient List<CrawlStatusListener> registeredCrawlStatusListeners = Collections.synchronizedList(new ArrayList<CrawlStatusListener>());//抓取狀態(tài)監聽(tīng)器,這里監聽(tīng)哪些URl被忽略,哪些URL抓取失敗等private transient CrawlURIDispositionListener registeredCrawlURIDispositionListener;//抓取狀態(tài)監聽(tīng)器數據protected transient ArrayList<CrawlURIDispositionListener> registeredCrawlURIDispositionListeners;// 應急儲備內存private transient LinkedList<char[]> reserveMemory;//抓取范圍管理private transient CrawlScope scope;// CrawlServer和CrawlHost的緩存private transient ServerCache serverCache;//配置文件,如order.xmlprivate transient SettingsHandler settingsHandler;//Heritrix狀態(tài),表示已經(jīng)存在private transient String sExit;// 鎖,控制同時(shí)只能一個(gè)線(xiàn)程運行使用本類(lèi)private transient ReentrantLock singleThreadLock = null;//是否是單線(xiàn)程模式private volatile transient boolean singleThreadMode = false;// 表示當前爬蟲(chóng)狀態(tài),新生的transient private Object state = NASCENT;// 統計跟蹤器protected StatisticsTracking statistics = null;//線(xiàn)程池private transient ToePool toePool;
同時(shí)屬性中有三個(gè)地方需要補充下:
1)"CHECKPOINTING".intern(); 為什么采用intern()方法?知道intern()方法的人都知道,intern在創(chuàng )建String對象時(shí)會(huì )先無(wú)內存里查看有沒(méi)有該對象,有的話(huà)直接返回,沒(méi)有則重新創(chuàng )建。而普通的new一般都是直接創(chuàng )建對象,如此在一定程序上可以節省開(kāi)銷(xiāo)
2)transient LinkedList<char[]> reserveMemory;應急內存。Heritrix在初始化的時(shí)候會(huì )先占用一部分內存,這里是6M。當發(fā)生內存溢出的時(shí)候則釋放這部分內存,然后做一些日志、報告方面的操作
3)private transient ReentrantLock singleThreadLock,重入鎖.大腦只能有一個(gè),所以需要用這個(gè)來(lái)保證一個(gè)大腦的存在,而不是多個(gè)。這里為什么不用單例模式來(lái)取代,而采用這種方法?我這里沒(méi)有用單例模式和這種方法進(jìn)行實(shí)驗比較,但直覺(jué)上告訴我,由于Heritrix是個(gè)多線(xiàn)程爬蟲(chóng),并且可以同時(shí)有多個(gè)抓取Job,但同時(shí)只能有一個(gè)job運行。單例模式的synchronized不能保證當一個(gè)job發(fā)生線(xiàn)程中斷時(shí),其他job可以獲得CrawlController的鎖來(lái)運行他們的抓取,因為synchronized會(huì )一直鎖住CrawlController對象.而使用ReentrantLock則可以做到這一點(diǎn)...我的想法,歡迎大家拍磚...
由于貼上方法介紹后本文章會(huì )太長(cháng),故方法介紹方法下一篇博客介紹,博客地址:http://guoyunsky.javaeye.com/blog/650744
聯(lián)系客服