代码里只有一个实现类SpiderImpl,成员如下:
WorkerThreadPool spiders,爬虫线程池;
WorkerThreadPool thinkers,思考者线程池。
初始化方法------------------------------------------------------------------------
包含三个参数,SpiderContext和两个线程池成员各自的大小。
首先根据大小值生成spiders和thinkers。
ConfigurationFactory类的静态成员JSpiderConfiguration(在主方法中生成)包含了spiders和thinkers相关的两个参数,一个是CONFIG_THREADING_MONITORING_ENABLED表示spider或者thinker是否开启,一个是CONFIG_THREADING_MONITORING_INTERVAL表示监视的时间间隔。
在CONFIG_THREADING_MONITORING_ENABLED为true的情况下,初始化中会新建一个线程类ThreadPoolMonitorThread的匿名实例,第一个参数是context.getEventDispatcher(),即上下文的成员事件分派器,后面两个参数是监视的时间间隔和对应的线程池。
crawl方法------------------------------------------------------------------------
参数为一个SpiderContext实例context。
首先根据context的BaseURL生成了一个SpideringStartedEvent事件,并由context的分派器进行分派。
然后根据spiders、thinkers和context,生成了DispatchSpiderTasks和DispatchThinkerTasks的实例dispatchSpiderTask和dispatchThinkerTask,分别用来分派爬虫任务和思考者任务。
dispatchSpiderTask作为共享锁,限制了下面的这过程:
{
调用context的agent的start方法,其中对context的BaseURL进行了访问,并产生了访问事件;
spiders和thinkers调用了assignGroupTask方法,分别载入dispatchSpiderTask和dispatchThinkerTask来接收任务;
dispatchSpiderTask进入等待状态,spiders和thinkers在同时工作,这里捕获了InterruptedException异常,异常处理为调用本线程的interrupt方法;
}
spiders和thinkers停止所有线程;
根据context的storage的summary成员生成SpideringSummaryEvent事件,并由context的分派器派发;
根据context的storage成员生成SpideringStoppedEvent事件,并由context的分派器派发;
context的分派器关闭。
下一步分析dispatchSpiderTask和spiders的合作方式。