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

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

1.属性:

Java代码 收藏代码
  1. //状态,Checkpoinging:表示正在备份
  2. privatestaticfinalObjectCHECKPOINTING="CHECKPOINTING".intern();
  3. //状态,FINISHED:表示抓取结束
  4. privatestaticfinalObjectFINISHED="FINISHED".intern();
  5. //状态,NASCENT:表示正在生成一个JOB
  6. privatestaticfinalObjectNASCENT="NASCENT".intern();
  7. //状态,PAUSED:表示暂停结束,该状态Heritrix正暂停任何抓取
  8. privatestaticfinalObjectPAUSED="PAUSED".intern();
  9. //状态,PAUSING:表示正在暂停,传达一个暂停命令到每一个线程暂停中间需要时间
  10. privatestaticfinalObjectPAUSING="PAUSING".intern();
  11. //状态,PREPARING:表示抓取结束
  12. privatestaticfinalObjectPREPARING="PREPARING".intern();
  13. //状态,RUNNING:表示正在运行
  14. privatestaticfinalObjectRUNNING="RUNNING".intern();
  15. //状态,STARTED:表示已经启动
  16. privatestaticfinalObjectSTARTED="STARTED".intern();
  17. //状态,STOPPING:表示正在停止,传达一个停止命令到每一个线程暂停中间需要时间
  18. privatestaticfinalObjectSTOPPING="STOPPING".intern();
  19. //当前类的日志管理器
  20. privatefinalstaticLoggerLOGGER=Logger.getLogger(CrawlController.class
  21. .getName());
  22. //活动的日志文件名后缀
  23. publicstaticfinalStringCURRENT_LOG_SUFFIX=".log";
  24. //日志crawl.log.txt的文件名
  25. privatestaticfinalStringLOGNAME_CRAWL="crawl";
  26. //日志local-errors.log.txt的文件名
  27. privatestaticfinalStringLOGNAME_LOCAL_ERRORS="local-errors";
  28. //日志progress-statistics.log.txt的文件名
  29. privatestaticfinalStringLOGNAME_PROGRESS_STATISTICS="progress-statistics";
  30. //runtime-errors.txt的文件名
  31. privatestaticfinalStringLOGNAME_RUNTIME_ERRORS="runtime-errors";
  32. //日志uri-errors.txt的文件名
  33. privatestaticfinalStringLOGNAME_URI_ERRORS="uri-errors";
  34. //日志manifest-report的文件名前缀
  35. publicfinalstaticStringMANIFEST_REPORT="manifest";
  36. //processors-report.txt的文件名前缀
  37. publicfinalstaticStringPROCESSORS_REPORT="processors";
  38. //crawl-manifest日志文件中中配置文件标签缩写
  39. publicstaticfinalcharMANIFEST_CONFIG_FILE='C';
  40. //crawl-manifest日志文件中中日志文件标签缩写
  41. publicstaticfinalcharMANIFEST_LOG_FILE='L';
  42. //crawl-manifest日志文件中中报告文件标签缩写
  43. publicstaticfinalcharMANIFEST_REPORT_FILE='R';
  44. //报告文件名数组
  45. protectedfinalstaticString[]REPORTS={PROCESSORS_REPORT,
  46. MANIFEST_REPORT};
  47. //应急内存,当内存不够时Heritrix会释放这个内存去做一些紧急动作如数据备份
  48. privatestaticfinalintRESERVE_BLOCK_SIZE=6*2^20;//6MB
  49. privatestaticfinalintRESERVE_BLOCKS=1;
  50. //BDB数据库,Heritrix自己封装
  51. privatetransientEnhancedEnvironmentbdbEnvironment=null;
  52. //用于Checkpoint备份,存储需要备份的数据
  53. privatetransientMap<String,CachedBdbMap<?,?>>bigmaps=null;
  54. //备份器
  55. privateCheckpointercheckpointer;
  56. //备份对象
  57. privatetransientCheckpointcheckpointRecover=null;
  58. //备份目录
  59. privatetransientFilecheckpointsDisk;
  60. //整个Heritrix目录
  61. privatetransientFiledisk;
  62. //日志文件目录
  63. privatetransientFilelogsDisk;
  64. //scratch文件
  65. privatetransientFilescratchDisk;
  66. //BDB数据库文件
  67. privatetransientFilestateDisk;
  68. //日志处理器跟文件处理器关联
  69. transientprivateMap<Logger,FileHandler>fileHandlers;
  70. //调度器
  71. privatetransientFrontierfrontier;
  72. //日志处理器,关联local-errors.log
  73. publictransientLoggerlocalErrors;
  74. //日志处理器,关联progress-statistics.log
  75. privatetransientLoggerprogressStats;
  76. //日志处理器,关联报告文件
  77. publictransientLoggerreports;
  78. //日志处理器,关联runtime-errors.log
  79. publictransientLoggerruntimeErrors;
  80. //日志处理器,关联uri-Errors.log
  81. publictransientLoggeruriErrors;
  82. //日志处理器,关联crawl.log
  83. publictransientLoggeruriProcessing;
  84. //记录Hertrix创建的日志文件名
  85. privateStringBuffermanifest;
  86. //最大字节数,来源于配置文件
  87. privatelongmaxBytes;//
  88. //抓取限制,最大文档数,来源于配置文件
  89. privatelongmaxDocument;
  90. //抓取限制,最大时间,来源于配置文件
  91. privatelongmaxTime;
  92. //管理order.xml
  93. privatetransientCrawlOrderorder;
  94. //处理器链
  95. privatetransientProcessorChainListprocessorChains;
  96. //事件监听器,比如正在运行、停止
  97. privatetransientList<CrawlStatusListener>registeredCrawlStatusListeners=Collections
  98. .synchronizedList(newArrayList<CrawlStatusListener>());
  99. //抓取状态监听器,这里监听哪些URl被忽略,哪些URL抓取失败等
  100. privatetransientCrawlURIDispositionListenerregisteredCrawlURIDispositionListener;
  101. //抓取状态监听器数据
  102. protectedtransientArrayList<CrawlURIDispositionListener>registeredCrawlURIDispositionListeners;
  103. //应急储备内存
  104. privatetransientLinkedList<char[]>reserveMemory;
  105. //抓取范围管理
  106. privatetransientCrawlScopescope;
  107. //CrawlServer和CrawlHost的缓存
  108. privatetransientServerCacheserverCache;
  109. //配置文件,如order.xml
  110. privatetransientSettingsHandlersettingsHandler;
  111. //Heritrix状态,表示已经存在
  112. privatetransientStringsExit;
  113. //锁,控制同时只能一个线程运行使用本类
  114. privatetransientReentrantLocksingleThreadLock=null;
  115. //是否是单线程模式
  116. privatevolatiletransientbooleansingleThreadMode=false;
  117. //表示当前爬虫状态,新生的
  118. transientprivateObjectstate=NASCENT;
  119. //统计跟踪器
  120. protectedStatisticsTrackingstatistics=null;
  121. //线程池
  122. privatetransientToePooltoePool;

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值