zoukankan      html  css  js  c++  java
  • Heritrix源码分析(十二) Heritrix的控制中心(大脑)CrawlController(一)(转)

      本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/650694 

          本博客已迁移到本人独立博客: http://www.yun5u.com/

          欢迎加入Heritrix群(QQ):109148319,10447185  , Lucene/Solr群(QQ) :  118972724  

          CrawlController的确是Heritrix的大脑,在Heritrix中拥有无上的权利!可以控制Heritrix的启动、暂停、停止,也定时进行数据统计、数据汇报和文件管理。同时CrawlController也基本上贯穿整个Heritrix代码,和CrawlURI一样。同时CrawlController纯代码页进2000行,下面就先介绍里面的属性和主要方法,同时对一些灵活用法也加以介绍:

             1.属性:

    Java代码  收藏代码
    1. //状态,Checkpoinging:表示正在备份  
    2. private static final Object CHECKPOINTING = "CHECKPOINTING".intern();  
    3. //状态,FINISHED:表示抓取结束  
    4. private static final Object FINISHED = "FINISHED".intern();  
    5. //状态,NASCENT:表示正在生成一个JOB  
    6. private static final Object NASCENT = "NASCENT".intern();  
    7. //状态,PAUSED:表示暂停结束,该状态Heritrix正暂停任何抓取  
    8. private static final Object PAUSED = "PAUSED".intern();  
    9. //状态,PAUSING:表示正在暂停,传达一个暂停命令到每一个线程暂停中间需要时间  
    10. private static final Object PAUSING = "PAUSING".intern();  
    11. //状态,PREPARING:表示抓取结束  
    12. private static final Object PREPARING = "PREPARING".intern();  
    13. //状态,RUNNING:表示正在运行  
    14. private static final Object RUNNING = "RUNNING".intern();  
    15. //状态,STARTED:表示已经启动  
    16. private static final Object STARTED = "STARTED".intern();  
    17. //状态,STOPPING:表示正在停止,传达一个停止命令到每一个线程暂停中间需要时间  
    18. private static final Object STOPPING = "STOPPING".intern();  
    19.   
    20. //当前类的日志管理器  
    21. private final static Logger LOGGER = Logger.getLogger(CrawlController.class  
    22.         .getName());  
    23. // 活动的日志文件名后缀   
    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日志文件中中配置文件标签缩写   
    43. public static final char MANIFEST_CONFIG_FILE = 'C';  
    44. // crawl-manifest日志文件中中日志文件标签缩写   
    45. public static final char MANIFEST_LOG_FILE = 'L';  
    46. // crawl-manifest日志文件中中报告文件标签缩写   
    47. public static final char MANIFEST_REPORT_FILE = 'R';  
    48.   
    49. //报告文件名数组  
    50. protected final static String[] REPORTS = { PROCESSORS_REPORT,  
    51.         MANIFEST_REPORT };  
    52. //应急内存,当内存不够时Heritrix会释放这个内存去做一些紧急动作如数据备份  
    53. private static final int RESERVE_BLOCK_SIZE = 6 * 2 ^ 20// 6MB  
    54. private static final int RESERVE_BLOCKS = 1;  
    55.       
    56. //BDB数据库,Heritrix自己封装  
    57. private transient EnhancedEnvironment bdbEnvironment = null;  
    58. //用于Checkpoint备份,存储需要备份的数据  
    59. private transient Map<String, CachedBdbMap<?, ?>> bigmaps = null;  
    60. //备份器  
    61. private Checkpointer checkpointer;  
    62. //备份对象  
    63. private transient Checkpoint checkpointRecover = null;  
    64.   
    65. //备份目录  
    66. private transient File checkpointsDisk;  
    67. //整个Heritrix目录  
    68. private transient File disk;  
    69. //日志文件目录  
    70. private transient File logsDisk;   
    71. //scratch文件  
    72. private transient File scratchDisk;  
    73. //BDB数据库文件  
    74. private transient File stateDisk;  
    75.   
    76. //日志处理器跟文件处理器关联  
    77. transient private Map<Logger, FileHandler> fileHandlers;  
    78. //调度器  
    79. private transient Frontier frontier;  
    80.   
    81. // 日志处理器,关联local-errors.log  
    82. public transient Logger localErrors;  
    83. // 日志处理器,关联 progress-statistics.log  
    84. private transient Logger progressStats;  
    85. //日志处理器,关联报告文件  
    86. public transient Logger reports;  
    87. // 日志处理器,关联runtime-errors.log  
    88. public transient Logger runtimeErrors;  
    89. // 日志处理器,关联uri-Errors.log  
    90. public transient Logger uriErrors;  
    91. // 日志处理器,关联crawl.log  
    92. public transient Logger uriProcessing;   
    93.   
    94. //记录Hertrix创建的日志文件名  
    95. private StringBuffer manifest;  
    96.   
    97. //最大字节数,来源于配置文件  
    98. private long maxBytes; //   
    99. //抓取限制, 最大文档数,来源于配置文件  
    100. private long maxDocument;  
    101. // 抓取限制,最大时间,来源于配置文件  
    102. private long maxTime;   
    103. //管理order.xml  
    104. private transient CrawlOrder order;  
    105. //处理器链  
    106. private transient ProcessorChainList processorChains;  
    107.   
    108. //事件监听器,比如正在运行、停止  
    109. private transient List<CrawlStatusListener> registeredCrawlStatusListeners = Collections  
    110.         .synchronizedList(new ArrayList<CrawlStatusListener>());  
    111. //抓取状态监听器,这里监听哪些URl被忽略,哪些URL抓取失败等  
    112. private transient CrawlURIDispositionListener registeredCrawlURIDispositionListener;  
    113.   
    114. //抓取状态监听器数据  
    115. protected transient ArrayList<CrawlURIDispositionListener> registeredCrawlURIDispositionListeners;  
    116.   
    117. // 应急储备内存  
    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状态,表示已经存在  
    129. private transient String sExit;  
    130.   
    131. // 锁,控制同时只能一个线程运行使用本类  
    132. private transient ReentrantLock singleThreadLock = null;  
    133.   
    134. //是否是单线程模式  
    135. private volatile transient boolean singleThreadMode = false;  
    136. // 表示当前爬虫状态,新生的  
    137. transient private Object state = NASCENT;   
    138.   
    139. // 统计跟踪器  
    140. protected StatisticsTracking statistics = null;   
    141. //线程池  
    142. private transient ToePool toePool;  

    同时属性中有三个地方需要补充下:

         1)"CHECKPOINTING".intern(); 为什么采用intern()方法?知道intern()方法的人都知道,intern在创建String对象时会先无内存里查看有没有该对象,有的话直接返回,没有则重新创建。而普通的new一般都是直接创建对象,如此在一定程序上可以节省开销

         2)transient LinkedList<char[]> reserveMemory;应急内存。Heritrix在初始化的时候会先占用一部分内存,这里是6M。当发生内存溢出的时候则释放这部分内存,然后做一些日志、报告方面的操作

         3)private transient ReentrantLock singleThreadLock,重入锁.大脑只能有一个,所以需要用这个来保证一个大脑的存在,而不是多个。这里为什么不用单例模式来取代,而采用这种方法?我这里没有用单例模式和这种方法进行实验比较,但直觉上告诉我,由于Heritrix是个多线程爬虫,并且可以同时有多个抓取Job,但同时只能有一个job运行。单例模式的synchronized不能保证当一个job发生线程中断时,其他job可以获得CrawlController的锁来运行他们的抓取,因为synchronized会一直锁住CrawlController对象.而使用ReentrantLock则可以做到这一点...我的想法,欢迎大家拍砖...

     由于贴上方法介绍后本文章会太长,故方法介绍方法下一篇博客介绍,博客地址:http://guoyunsky.iteye.com/blog/650744

  • 相关阅读:
    2018-10-20-WPF-通过位处理合并图片
    2019-2-11-WPF-获取应用的所有窗口
    2019-2-11-WPF-获取应用的所有窗口
    2018-8-10-WPF-如何在绑定失败异常
    2018-8-10-WPF-如何在绑定失败异常
    类和对象
    类和对象
    什么是可串行化MVCC
    LeetCode-环形链表|+环形链表||
    用js仿探探拖拽卡片的效果、飞卡片的效果,感觉挺酷,最后有美女看哦!
  • 原文地址:https://www.cnblogs.com/seurain/p/3200628.html
Copyright © 2011-2022 走看看