乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Heritrix源碼分析(十二) Heritrix的控制中心(大腦)CrawlContro...

       tianweibin 2010-09-14

      Heritrix源碼分析(十二) Heritrix的控制中心(大腦)CrawlController(一)

      文章分類:互聯(lián)網(wǎng)

            本博客屬原創(chuàng)文章,歡迎轉(zhuǎn)載!轉(zhuǎn)載請(qǐng)務(wù)必注明出處:http://guoyunsky./blog/650694 

            歡迎加入Heritrix群(QQ):10447185 

       

            CrawlController的確是Heritrix的大腦,在Heritrix中擁有無上的權(quán)利!可以控制Heritrix的啟動(dòng)、暫停、停止,也定時(shí)進(jìn)行數(shù)據(jù)統(tǒng)計(jì)、數(shù)據(jù)匯報(bào)和文件管理。同時(shí)CrawlController也基本上貫穿整個(gè)Heritrix代碼,和CrawlURI一樣。同時(shí)CrawlController純代碼頁(yè)進(jìn)2000行,下面就先介紹里面的屬性和主要方法,同時(shí)對(duì)一些靈活用法也加以介紹:

               1.屬性:

      Java代碼 復(fù)制代碼
      1. //狀態(tài),Checkpoinging:表示正在備份   
      2. private static final Object CHECKPOINTING = "CHECKPOINTING".intern();   
      3. //狀態(tài),FINISHED:表示抓取結(jié)束   
      4. private static final Object FINISHED = "FINISHED".intern();   
      5. //狀態(tài),NASCENT:表示正在生成一個(gè)JOB   
      6. private static final Object NASCENT = "NASCENT".intern();   
      7. //狀態(tài),PAUSED:表示暫停結(jié)束,該狀態(tài)Heritrix正暫停任何抓取   
      8. private static final Object PAUSED = "PAUSED".intern();   
      9. //狀態(tài),PAUSING:表示正在暫停,傳達(dá)一個(gè)暫停命令到每一個(gè)線程暫停中間需要時(shí)間   
      10. private static final Object PAUSING = "PAUSING".intern();   
      11. //狀態(tài),PREPARING:表示抓取結(jié)束   
      12. private static final Object PREPARING = "PREPARING".intern();   
      13. //狀態(tài),RUNNING:表示正在運(yùn)行   
      14. private static final Object RUNNING = "RUNNING".intern();   
      15. //狀態(tài),STARTED:表示已經(jīng)啟動(dòng)   
      16. private static final Object STARTED = "STARTED".intern();   
      17. //狀態(tài),STOPPING:表示正在停止,傳達(dá)一個(gè)停止命令到每一個(gè)線程暫停中間需要時(shí)間   
      18. private static final Object STOPPING = "STOPPING".intern();   
      19.   
      20. //當(dāng)前類的日志管理器   
      21. private final static Logger LOGGER = Logger.getLogger(CrawlController.class  
      22.         .getName());   
      23. // 活動(dòng)的日志文件名后綴    
      24. public static final String CURRENT_LOG_SUFFIX = ".log";   
      25.   
      26. // 日志crawl.log.txt的文件名   
      27. private static final String LOGNAME_CRAWL = "crawl";   
      28. // 日志local-errors.log.txt的文件名   
      29. private static final String LOGNAME_LOCAL_ERRORS = "local-errors";   
      30. // 日志progress-statistics.log.txt的文件名   
      31. private static final String LOGNAME_PROGRESS_STATISTICS = "progress-statistics";   
      32. // runtime-errors.txt的文件名   
      33. private static final String LOGNAME_RUNTIME_ERRORS = "runtime-errors";   
      34. // 日志uri-errors.txt的文件名   
      35. private static final String LOGNAME_URI_ERRORS = "uri-errors";   
      36.   
      37. // 日志manifest-report的文件名前綴   
      38. public final static String MANIFEST_REPORT = "manifest";   
      39. //processors-report.txt的文件名前綴   
      40. public final static String PROCESSORS_REPORT = "processors";   
      41.   
      42. // crawl-manifest日志文件中中配置文件標(biāo)簽縮寫    
      43. public static final char MANIFEST_CONFIG_FILE = 'C';   
      44. // crawl-manifest日志文件中中日志文件標(biāo)簽縮寫    
      45. public static final char MANIFEST_LOG_FILE = 'L';   
      46. // crawl-manifest日志文件中中報(bào)告文件標(biāo)簽縮寫    
      47. public static final char MANIFEST_REPORT_FILE = 'R';   
      48.   
      49. //報(bào)告文件名數(shù)組   
      50. protected final static String[] REPORTS = { PROCESSORS_REPORT,   
      51.         MANIFEST_REPORT };   
      52. //應(yīng)急內(nèi)存,當(dāng)內(nèi)存不夠時(shí)Heritrix會(huì)釋放這個(gè)內(nèi)存去做一些緊急動(dòng)作如數(shù)據(jù)備份   
      53. private static final int RESERVE_BLOCK_SIZE = 6 * 2 ^ 20// 6MB   
      54. private static final int RESERVE_BLOCKS = 1;   
      55.        
      56. //BDB數(shù)據(jù)庫(kù),Heritrix自己封裝   
      57. private transient EnhancedEnvironment bdbEnvironment = null;   
      58. //用于Checkpoint備份,存儲(chǔ)需要備份的數(shù)據(jù)   
      59. private transient Map<String, CachedBdbMap<?, ?>> bigmaps = null;   
      60. //備份器   
      61. private Checkpointer checkpointer;   
      62. //備份對(duì)象   
      63. private transient Checkpoint checkpointRecover = null;   
      64.   
      65. //備份目錄   
      66. private transient File checkpointsDisk;   
      67. //整個(gè)Heritrix目錄   
      68. private transient File disk;   
      69. //日志文件目錄   
      70. private transient File logsDisk;    
      71. //scratch文件   
      72. private transient File scratchDisk;   
      73. //BDB數(shù)據(jù)庫(kù)文件   
      74. private transient File stateDisk;   
      75.   
      76. //日志處理器跟文件處理器關(guān)聯(lián)   
      77. transient private Map<Logger, FileHandler> fileHandlers;   
      78. //調(diào)度器   
      79. private transient Frontier frontier;   
      80.   
      81. // 日志處理器,關(guān)聯(lián)local-errors.log   
      82. public transient Logger localErrors;   
      83. // 日志處理器,關(guān)聯(lián) progress-statistics.log   
      84. private transient Logger progressStats;   
      85. //日志處理器,關(guān)聯(lián)報(bào)告文件   
      86. public transient Logger reports;   
      87. // 日志處理器,關(guān)聯(lián)runtime-errors.log   
      88. public transient Logger runtimeErrors;   
      89. // 日志處理器,關(guān)聯(lián)uri-Errors.log   
      90. public transient Logger uriErrors;   
      91. // 日志處理器,關(guān)聯(lián)crawl.log   
      92. public transient Logger uriProcessing;    
      93.   
      94. //記錄Hertrix創(chuàng)建的日志文件名   
      95. private StringBuffer manifest;   
      96.   
      97. //最大字節(jié)數(shù),來源于配置文件   
      98. private long maxBytes; //    
      99. //抓取限制, 最大文檔數(shù),來源于配置文件   
      100. private long maxDocument;   
      101. // 抓取限制,最大時(shí)間,來源于配置文件   
      102. private long maxTime;    
      103. //管理order.xml   
      104. private transient CrawlOrder order;   
      105. //處理器鏈   
      106. private transient ProcessorChainList processorChains;   
      107.   
      108. //事件監(jiān)聽器,比如正在運(yùn)行、停止   
      109. private transient List<CrawlStatusListener> registeredCrawlStatusListeners = Collections   
      110.         .synchronizedList(new ArrayList<CrawlStatusListener>());   
      111. //抓取狀態(tài)監(jiān)聽器,這里監(jiān)聽哪些URl被忽略,哪些URL抓取失敗等   
      112. private transient CrawlURIDispositionListener registeredCrawlURIDispositionListener;   
      113.   
      114. //抓取狀態(tài)監(jiān)聽器數(shù)據(jù)   
      115. protected transient ArrayList<CrawlURIDispositionListener> registeredCrawlURIDispositionListeners;   
      116.   
      117. // 應(yīng)急儲(chǔ)備內(nèi)存   
      118. private transient LinkedList<char[]> reserveMemory;   
      119.   
      120. //抓取范圍管理   
      121. private transient CrawlScope scope;   
      122.   
      123. // CrawlServer和CrawlHost的緩存   
      124. private transient ServerCache serverCache;    
      125.   
      126. //配置文件,如order.xml   
      127. private transient SettingsHandler settingsHandler;   
      128. //Heritrix狀態(tài),表示已經(jīng)存在   
      129. private transient String sExit;   
      130.   
      131. // 鎖,控制同時(shí)只能一個(gè)線程運(yùn)行使用本類   
      132. private transient ReentrantLock singleThreadLock = null;   
      133.   
      134. //是否是單線程模式   
      135. private volatile transient boolean singleThreadMode = false;   
      136. // 表示當(dāng)前爬蟲狀態(tài),新生的   
      137. transient private Object state = NASCENT;    
      138.   
      139. // 統(tǒng)計(jì)跟蹤器   
      140. protected StatisticsTracking statistics = null;    
      141. //線程池   
      142. private transient ToePool toePool;  

       

      同時(shí)屬性中有三個(gè)地方需要補(bǔ)充下:

           1)"CHECKPOINTING".intern(); 為什么采用intern()方法?知道intern()方法的人都知道,intern在創(chuàng)建String對(duì)象時(shí)會(huì)先無內(nèi)存里查看有沒有該對(duì)象,有的話直接返回,沒有則重新創(chuàng)建。而普通的new一般都是直接創(chuàng)建對(duì)象,如此在一定程序上可以節(jié)省開銷

           2)transient LinkedList<char[]> reserveMemory;應(yīng)急內(nèi)存。Heritrix在初始化的時(shí)候會(huì)先占用一部分內(nèi)存,這里是6M。當(dāng)發(fā)生內(nèi)存溢出的時(shí)候則釋放這部分內(nèi)存,然后做一些日志、報(bào)告方面的操作

           3)private transient ReentrantLock singleThreadLock,重入鎖.大腦只能有一個(gè),所以需要用這個(gè)來保證一個(gè)大腦的存在,而不是多個(gè)。這里為什么不用單例模式來取代,而采用這種方法?我這里沒有用單例模式和這種方法進(jìn)行實(shí)驗(yàn)比較,但直覺上告訴我,由于Heritrix是個(gè)多線程爬蟲,并且可以同時(shí)有多個(gè)抓取Job,但同時(shí)只能有一個(gè)job運(yùn)行。單例模式的synchronized不能保證當(dāng)一個(gè)job發(fā)生線程中斷時(shí),其他job可以獲得CrawlController的鎖來運(yùn)行他們的抓取,因?yàn)閟ynchronized會(huì)一直鎖住CrawlController對(duì)象.而使用ReentrantLock則可以做到這一點(diǎn)...我的想法,歡迎大家拍磚...

       

       由于貼上方法介紹后本文章會(huì)太長(zhǎng),故方法介紹方法下一篇博客介紹,博客地址:http://guoyunsky./blog/650744

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多