JSpider学习四 —— Spider

来源:互联网 发布:打车软件收费 编辑:程序博客网 时间:2024/05/16 02:14
在代码里Spider是一个接口,其中只包含public void crawl(SpiderContext context)这一个方法,含义比较明显,在给定的上下文中爬行。

    代码里只有一个实现类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,生成了DispatchSpiderTasksDispatchThinkerTasks的实例dispatchSpiderTaskdispatchThinkerTask,分别用来分派爬虫任务和思考者任务。

    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的合作方式。