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.属性:
- //状态,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(一)(转)的更多相关文章
- Heritrix源码分析(十四) 如何让Heritrix不间断的抓取(转)
欢迎加入Heritrix群(QQ):109148319,10447185 , Lucene/Solr群(QQ) : 118972724 本博客已迁移到本人独立博客: http://www.yun5u ...
- Heritrix源码分析(十四)
近段时间在搞定Lucene的一些问题,所以Heritrix源码分析暂时告一段落.今天下午在群里有同学提到了Heritrix异常终止的问题以及让Heritrix不停的抓取(就是抓完一遍后载入种子继续抓取 ...
- ABP源码分析十二:本地化
本文逐个分析ABP中涉及到locaization的接口和类,以及相互之间的关系.本地化主要涉及两个方面:一个是语言(Language)的管理,这部分相对简单.另一个是语言对应得本地化资源(Locali ...
- [Abp 源码分析]十二、多租户体系与权限验证
0.简介 承接上篇文章我们会在这篇文章详细解说一下 Abp 是如何结合 IPermissionChecker 与 IFeatureChecker 来实现一个完整的多租户系统的权限校验的. 1.多租户的 ...
- jQuery 源码分析(十二) 数据操作模块 html特性 详解
jQuery的属性操作模块总共有4个部分,本篇说一下第1个部分:HTML特性部分,html特性部分是对原生方法getAttribute()和setAttribute()的封装,用于修改DOM元素的特性 ...
- Vue.js 源码分析(十二) 基础篇 组件详解
组件是可复用的Vue实例,一个组件本质上是一个拥有预定义选项的一个Vue实例,组件和组件之间通过一些属性进行联系. 组件有两种注册方式,分别是全局注册和局部注册,前者通过Vue.component() ...
- Heritrix源码分析(十五) 各种问题总结(转)
开博客以及建立Heritrix 群有一段时间了(这里谢谢大家的关注),这篇博客将整理这段时间所遇到的问题.同时由于自己从今年5月份开始就不怎么接触Heritrix,很多东西开始遗忘(不过里面思想没忘) ...
- Heritrix源码分析(十五)
开博客以及建立Heritrix 群有一段时间了(这里谢谢大家的关注),这篇博客将整理这段时间所遇到的问题.同时由于自己从今年5月份开始就不怎么接触Heritrix,很多东西开始遗忘(不过里面思想没忘) ...
- Heritrix源码分析(十) Heritrix中的Http Status Code(Http状态码)(转)
本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/649737 本博客已迁移到本人独立博客: http://www.yun5u ...
随机推荐
- 在运行jar时自动加载指定的jar包
初学Java的人经常遇到的一个问题是:如果一个程序依赖某个文件夹下的一堆jar包,那么启动它的时候就需要在java -cp参数后面一个一个的加上jar包的名称,很不方便. 比如主程序类叫Main,在目 ...
- POJ 1523 SPF(求割点)
题目链接 题意 : 找出图中所有的割点,然后输出删掉他们之后还剩多少个连通分量. 思路 : v与u邻接,要么v是u的孩子,要么u是v的祖先,(u,v)构成一条回边. //poj1523 #includ ...
- ExtJs之Ext.form.field.TimePicker DatePicker组合框
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- 传说中的WCF(4):发送和接收SOAP头
如果你实在不明白Header是个啥玩意儿,你就想一想你发送电子邮件时,是不是有个叫“附件”的东东?对啊,那么SOAP头是不是可以理解为一种附加信息?就是附加到消息正文的内容. 消息正文又是啥?WCF除 ...
- 李洪强iOS经典面试题12
1.说说响应链 答: 事件响应链.包括点击事件,画面刷新事件等.在视图栈内从上至下,或者从下之上传播. 可以说点事件的分发,传递以及处理.具体可以去看下touch事件这块.因为问的太抽象化了 严重怀 ...
- hdu 4764 Stone (巴什博弈,披着狼皮的羊,小样,以为换了身皮就不认识啦)
今天(2013/9/28)长春站,最后一场网络赛! 3~5分钟后有队伍率先发现伪装了的签到题(博弈) 思路: 与取石头的巴什博弈对比 题目要求第一个人取数字在[1,k]间的某数x,后手取x加[1,k] ...
- Java-马士兵设计模式学习笔记-责任链模式-处理数据
一.目标 数据提交前做各种处理 二.代码 1.MsgProcessor.java public class MsgProcessor { private List<Filter> filt ...
- wordpress自定义栏目
开启自定义栏目:点击头顶的“显示选项”,勾选“自定义栏目” 然后编辑文章时,即可看见 实验: 定义名称为:play_url ,值为:http://www.xiami.com/widget/635357 ...
- photoshop:css3插件
CSS3PS是Photoshop 插件,用来将 PhotoShop 的图层如内阴影.内发光.阴影.外发光.图片圆角等效果转成用 CSS3 样式. 官方下载地址>> http://css3p ...
- web appbuilder 改变样式和添加自定义widget
一.改变样式 要实现的效果是添加cyan样式 1.将FoldableTheme/style下的cyan copy到TabTheme下的同一目录下: 2.打开TabTheme下的manifest,cop ...