CrawlController的确是Heritrix的大脑,在Heritrix中拥有无上的权利!可以控制Heritrix的启动、暂停、停止,也定时进行数据统计、数据汇报和文件管理。同时CrawlController也基本上贯穿整个Heritrix代码,和CrawlURI一样。同时CrawlController纯代码页进2000行,下面就先介绍里面的属性和主要方法,同时对一些灵活用法也加以介绍:
1.属性:
- //状态,Checkpoinging:表示正在备份
- privatestaticfinalObjectCHECKPOINTING="CHECKPOINTING".intern();
- //状态,FINISHED:表示抓取结束
- privatestaticfinalObjectFINISHED="FINISHED".intern();
- //状态,NASCENT:表示正在生成一个JOB
- privatestaticfinalObjectNASCENT="NASCENT".intern();
- //状态,PAUSED:表示暂停结束,该状态Heritrix正暂停任何抓取
- privatestaticfinalObjectPAUSED="PAUSED".intern();
- //状态,PAUSING:表示正在暂停,传达一个暂停命令到每一个线程暂停中间需要时间
- privatestaticfinalObjectPAUSING="PAUSING".intern();
- //状态,PREPARING:表示抓取结束
- privatestaticfinalObjectPREPARING="PREPARING".intern();
- //状态,RUNNING:表示正在运行
- privatestaticfinalObjectRUNNING="RUNNING".intern();
- //状态,STARTED:表示已经启动
- privatestaticfinalObjectSTARTED="STARTED".intern();
- //状态,STOPPING:表示正在停止,传达一个停止命令到每一个线程暂停中间需要时间
- privatestaticfinalObjectSTOPPING="STOPPING".intern();
- //当前类的日志管理器
- privatefinalstaticLoggerLOGGER=Logger.getLogger(CrawlController.class
- .getName());
- //活动的日志文件名后缀
- publicstaticfinalStringCURRENT_LOG_SUFFIX=".log";
- //日志crawl.log.txt的文件名
- privatestaticfinalStringLOGNAME_CRAWL="crawl";
- //日志local-errors.log.txt的文件名
- privatestaticfinalStringLOGNAME_LOCAL_ERRORS="local-errors";
- //日志progress-statistics.log.txt的文件名
- privatestaticfinalStringLOGNAME_PROGRESS_STATISTICS="progress-statistics";
- //runtime-errors.txt的文件名
- privatestaticfinalStringLOGNAME_RUNTIME_ERRORS="runtime-errors";
- //日志uri-errors.txt的文件名
- privatestaticfinalStringLOGNAME_URI_ERRORS="uri-errors";
- //日志manifest-report的文件名前缀
- publicfinalstaticStringMANIFEST_REPORT="manifest";
- //processors-report.txt的文件名前缀
- publicfinalstaticStringPROCESSORS_REPORT="processors";
- //crawl-manifest日志文件中中配置文件标签缩写
- publicstaticfinalcharMANIFEST_CONFIG_FILE='C';
- //crawl-manifest日志文件中中日志文件标签缩写
- publicstaticfinalcharMANIFEST_LOG_FILE='L';
- //crawl-manifest日志文件中中报告文件标签缩写
- publicstaticfinalcharMANIFEST_REPORT_FILE='R';
- //报告文件名数组
- protectedfinalstaticString[]REPORTS={PROCESSORS_REPORT,
- MANIFEST_REPORT};
- //应急内存,当内存不够时Heritrix会释放这个内存去做一些紧急动作如数据备份
- privatestaticfinalintRESERVE_BLOCK_SIZE=6*2^20;//6MB
- privatestaticfinalintRESERVE_BLOCKS=1;
- //BDB数据库,Heritrix自己封装
- privatetransientEnhancedEnvironmentbdbEnvironment=null;
- //用于Checkpoint备份,存储需要备份的数据
- privatetransientMap<String,CachedBdbMap<?,?>>bigmaps=null;
- //备份器
- privateCheckpointercheckpointer;
- //备份对象
- privatetransientCheckpointcheckpointRecover=null;
- //备份目录
- privatetransientFilecheckpointsDisk;
- //整个Heritrix目录
- privatetransientFiledisk;
- //日志文件目录
- privatetransientFilelogsDisk;
- //scratch文件
- privatetransientFilescratchDisk;
- //BDB数据库文件
- privatetransientFilestateDisk;
- //日志处理器跟文件处理器关联
- transientprivateMap<Logger,FileHandler>fileHandlers;
- //调度器
- privatetransientFrontierfrontier;
- //日志处理器,关联local-errors.log
- publictransientLoggerlocalErrors;
- //日志处理器,关联progress-statistics.log
- privatetransientLoggerprogressStats;
- //日志处理器,关联报告文件
- publictransientLoggerreports;
- //日志处理器,关联runtime-errors.log
- publictransientLoggerruntimeErrors;
- //日志处理器,关联uri-Errors.log
- publictransientLoggeruriErrors;
- //日志处理器,关联crawl.log
- publictransientLoggeruriProcessing;
- //记录Hertrix创建的日志文件名
- privateStringBuffermanifest;
- //最大字节数,来源于配置文件
- privatelongmaxBytes;//
- //抓取限制,最大文档数,来源于配置文件
- privatelongmaxDocument;
- //抓取限制,最大时间,来源于配置文件
- privatelongmaxTime;
- //管理order.xml
- privatetransientCrawlOrderorder;
- //处理器链
- privatetransientProcessorChainListprocessorChains;
- //事件监听器,比如正在运行、停止
- privatetransientList<CrawlStatusListener>registeredCrawlStatusListeners=Collections
- .synchronizedList(newArrayList<CrawlStatusListener>());
- //抓取状态监听器,这里监听哪些URl被忽略,哪些URL抓取失败等
- privatetransientCrawlURIDispositionListenerregisteredCrawlURIDispositionListener;
- //抓取状态监听器数据
- protectedtransientArrayList<CrawlURIDispositionListener>registeredCrawlURIDispositionListeners;
- //应急储备内存
- privatetransientLinkedList<char[]>reserveMemory;
- //抓取范围管理
- privatetransientCrawlScopescope;
- //CrawlServer和CrawlHost的缓存
- privatetransientServerCacheserverCache;
- //配置文件,如order.xml
- privatetransientSettingsHandlersettingsHandler;
- //Heritrix状态,表示已经存在
- privatetransientStringsExit;
- //锁,控制同时只能一个线程运行使用本类
- privatetransientReentrantLocksingleThreadLock=null;
- //是否是单线程模式
- privatevolatiletransientbooleansingleThreadMode=false;
- //表示当前爬虫状态,新生的
- transientprivateObjectstate=NASCENT;
- //统计跟踪器
- protectedStatisticsTrackingstatistics=null;
- //线程池
- 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