Heritrix源码分析(十二) Heritrix的控制中心(大脑)CrawlController(一)(转)
2013-07-19 15:25
405 查看
本博客属原创文章,欢迎转载!转载请务必注明出处: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代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201307/cc18a1bd58556435b78e0e70fe54396b.png)
//状态,Checkpoinging:表示正在备份
private static final Object CHECKPOINTING = "CHECKPOINTING".intern();
//状态,FINISHED:表示抓取结束
private static final Object FINISHED = "FINISHED".intern();
//状态,NASCENT:表示正在生成一个JOB
private static final Object NASCENT = "NASCENT".intern();
//状态,PAUSED:表示暂停结束,该状态Heritrix正暂停任何抓取
private static final Object PAUSED = "PAUSED".intern();
//状态,PAUSING:表示正在暂停,传达一个暂停命令到每一个线程暂停中间需要时间
private static final Object PAUSING = "PAUSING".intern();
//状态,PREPARING:表示抓取结束
private static final Object PREPARING = "PREPARING".intern();
//状态,RUNNING:表示正在运行
private static final Object RUNNING = "RUNNING".intern();
//状态,STARTED:表示已经启动
private static final Object STARTED = "STARTED".intern();
//状态,STOPPING:表示正在停止,传达一个停止命令到每一个线程暂停中间需要时间
private static final Object STOPPING = "STOPPING".intern();
//当前类的日志管理器
private final static Logger LOGGER = Logger.getLogger(CrawlController.class
.getName());
// 活动的日志文件名后缀
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日志文件中中配置文件标签缩写
public static final char MANIFEST_CONFIG_FILE = 'C';
// crawl-manifest日志文件中中日志文件标签缩写
public static final char MANIFEST_LOG_FILE = 'L';
// crawl-manifest日志文件中中报告文件标签缩写
public static final char MANIFEST_REPORT_FILE = 'R';
//报告文件名数组
protected final static String[] REPORTS = { PROCESSORS_REPORT,
MANIFEST_REPORT };
//应急内存,当内存不够时Heritrix会释放这个内存去做一些紧急动作如数据备份
private static final int RESERVE_BLOCK_SIZE = 6 * 2 ^ 20; // 6MB
private 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;
//整个Heritrix目录
private transient File disk;
//日志文件目录
private transient File logsDisk;
//scratch文件
private transient File scratchDisk;
//BDB数据库文件
private transient File stateDisk;
//日志处理器跟文件处理器关联
transient private Map<Logger, FileHandler> fileHandlers;
//调度器
private transient Frontier frontier;
// 日志处理器,关联local-errors.log
public transient Logger localErrors;
// 日志处理器,关联 progress-statistics.log
private transient Logger progressStats;
//日志处理器,关联报告文件
public transient Logger reports;
// 日志处理器,关联runtime-errors.log
public transient Logger runtimeErrors;
// 日志处理器,关联uri-Errors.log
public transient Logger uriErrors;
// 日志处理器,关联crawl.log
public transient Logger uriProcessing;
//记录Hertrix创建的日志文件名
private StringBuffer manifest;
//最大字节数,来源于配置文件
private long maxBytes; //
//抓取限制, 最大文档数,来源于配置文件
private long maxDocument;
// 抓取限制,最大时间,来源于配置文件
private long maxTime;
//管理order.xml
private transient CrawlOrder order;
//处理器链
private transient ProcessorChainList processorChains;
//事件监听器,比如正在运行、停止
private transient List<CrawlStatusListener> registeredCrawlStatusListeners = Collections
.synchronizedList(new ArrayList<CrawlStatusListener>());
//抓取状态监听器,这里监听哪些URl被忽略,哪些URL抓取失败等
private transient CrawlURIDispositionListener registeredCrawlURIDispositionListener;
//抓取状态监听器数据
protected transient ArrayList<CrawlURIDispositionListener> registeredCrawlURIDispositionListeners;
// 应急储备内存
private transient LinkedList<char[]> reserveMemory;
//抓取范围管理
private transient CrawlScope scope;
// CrawlServer和CrawlHost的缓存
private transient ServerCache serverCache;
//配置文件,如order.xml
private transient SettingsHandler settingsHandler;
//Heritrix状态,表示已经存在
private transient String sExit;
// 锁,控制同时只能一个线程运行使用本类
private transient ReentrantLock singleThreadLock = null;
//是否是单线程模式
private volatile transient boolean singleThreadMode = false;
// 表示当前爬虫状态,新生的
transient private Object state = NASCENT;
// 统计跟踪器
protected StatisticsTracking statistics = null;
//线程池
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
本博客已迁移到本人独立博客: http://www.yun5u.com/
欢迎加入Heritrix群(QQ):109148319,10447185, Lucene/Solr群(QQ) : 118972724
CrawlController的确是Heritrix的大脑,在Heritrix中拥有无上的权利!可以控制Heritrix的启动、暂停、停止,也定时进行数据统计、数据汇报和文件管理。同时CrawlController也基本上贯穿整个Heritrix代码,和CrawlURI一样。同时CrawlController纯代码页进2000行,下面就先介绍里面的属性和主要方法,同时对一些灵活用法也加以介绍:
1.属性:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201307/cc18a1bd58556435b78e0e70fe54396b.png)
//状态,Checkpoinging:表示正在备份
private static final Object CHECKPOINTING = "CHECKPOINTING".intern();
//状态,FINISHED:表示抓取结束
private static final Object FINISHED = "FINISHED".intern();
//状态,NASCENT:表示正在生成一个JOB
private static final Object NASCENT = "NASCENT".intern();
//状态,PAUSED:表示暂停结束,该状态Heritrix正暂停任何抓取
private static final Object PAUSED = "PAUSED".intern();
//状态,PAUSING:表示正在暂停,传达一个暂停命令到每一个线程暂停中间需要时间
private static final Object PAUSING = "PAUSING".intern();
//状态,PREPARING:表示抓取结束
private static final Object PREPARING = "PREPARING".intern();
//状态,RUNNING:表示正在运行
private static final Object RUNNING = "RUNNING".intern();
//状态,STARTED:表示已经启动
private static final Object STARTED = "STARTED".intern();
//状态,STOPPING:表示正在停止,传达一个停止命令到每一个线程暂停中间需要时间
private static final Object STOPPING = "STOPPING".intern();
//当前类的日志管理器
private final static Logger LOGGER = Logger.getLogger(CrawlController.class
.getName());
// 活动的日志文件名后缀
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日志文件中中配置文件标签缩写
public static final char MANIFEST_CONFIG_FILE = 'C';
// crawl-manifest日志文件中中日志文件标签缩写
public static final char MANIFEST_LOG_FILE = 'L';
// crawl-manifest日志文件中中报告文件标签缩写
public static final char MANIFEST_REPORT_FILE = 'R';
//报告文件名数组
protected final static String[] REPORTS = { PROCESSORS_REPORT,
MANIFEST_REPORT };
//应急内存,当内存不够时Heritrix会释放这个内存去做一些紧急动作如数据备份
private static final int RESERVE_BLOCK_SIZE = 6 * 2 ^ 20; // 6MB
private 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;
//整个Heritrix目录
private transient File disk;
//日志文件目录
private transient File logsDisk;
//scratch文件
private transient File scratchDisk;
//BDB数据库文件
private transient File stateDisk;
//日志处理器跟文件处理器关联
transient private Map<Logger, FileHandler> fileHandlers;
//调度器
private transient Frontier frontier;
// 日志处理器,关联local-errors.log
public transient Logger localErrors;
// 日志处理器,关联 progress-statistics.log
private transient Logger progressStats;
//日志处理器,关联报告文件
public transient Logger reports;
// 日志处理器,关联runtime-errors.log
public transient Logger runtimeErrors;
// 日志处理器,关联uri-Errors.log
public transient Logger uriErrors;
// 日志处理器,关联crawl.log
public transient Logger uriProcessing;
//记录Hertrix创建的日志文件名
private StringBuffer manifest;
//最大字节数,来源于配置文件
private long maxBytes; //
//抓取限制, 最大文档数,来源于配置文件
private long maxDocument;
// 抓取限制,最大时间,来源于配置文件
private long maxTime;
//管理order.xml
private transient CrawlOrder order;
//处理器链
private transient ProcessorChainList processorChains;
//事件监听器,比如正在运行、停止
private transient List<CrawlStatusListener> registeredCrawlStatusListeners = Collections
.synchronizedList(new ArrayList<CrawlStatusListener>());
//抓取状态监听器,这里监听哪些URl被忽略,哪些URL抓取失败等
private transient CrawlURIDispositionListener registeredCrawlURIDispositionListener;
//抓取状态监听器数据
protected transient ArrayList<CrawlURIDispositionListener> registeredCrawlURIDispositionListeners;
// 应急储备内存
private transient LinkedList<char[]> reserveMemory;
//抓取范围管理
private transient CrawlScope scope;
// CrawlServer和CrawlHost的缓存
private transient ServerCache serverCache;
//配置文件,如order.xml
private transient SettingsHandler settingsHandler;
//Heritrix状态,表示已经存在
private transient String sExit;
// 锁,控制同时只能一个线程运行使用本类
private transient ReentrantLock singleThreadLock = null;
//是否是单线程模式
private volatile transient boolean singleThreadMode = false;
// 表示当前爬虫状态,新生的
transient private Object state = NASCENT;
// 统计跟踪器
protected StatisticsTracking statistics = null;
//线程池
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
相关文章推荐
- Heritrix源码分析(十二) Heritrix的控制中心(大脑)CrawlController(一)
- Heritrix1.14源码分析(12) Heritrix的控制中心(大脑)CrawlController
- Heritrix1.14源码分析(12) Heritrix的控制中心(大脑)CrawlController
- Heritrix源码分析(十三) Heritrix的控制中心(大脑)CrawlController(二)
- Heritrix源码分析(十三) Heritrix的控制中心(大脑)CrawlController(二)
- Spring Security源码分析十二:Spring Security 基于表达式的权限控制
- Heritrix源码分析(四) 各个类说明(一)
- 蔡军生先生第二人生的源码分析(三十一)接收数据的流量控制
- Heritrix1.14源码分析(6) Heritrix总体介绍
- Hadoop源码分析笔记(十二):名字节点--文件系统目录树
- Spring Security源码分析十五:Spring Security 页面权限控制
- LDD3源码分析之访问控制
- Heritrix源码分析(四) 各个类说明(一)
- Hbase-0.98.6源码分析--MVCC多版本并发控制技术
- Heritrix1.14源码分析(7) Heritrix的文件结构分析
- spring mvc控制框架的流程及原理1: 总概及源码分析
- Java-Collection源码分析(十二)——Set、AbstractSet、HashSet和LinkedHashSet
- Heritrix源码分析(十四) 如何让Heritrix不间断的抓取(转)
- Heritrix源码分析(四) 各个类说明(二)
- LDD3源码分析之访问控制