nutch插件加载机制

当某个插件需要被加载时, Nutch 会加载所有插件的相关接口到缓存,此后每个插件需要实例的时候,根据相关接口和相关接口实现实例在缓存内的记录,使用反射实现一个实例并返回,下面以 QueryFilter 的所有插件被加载例子进行说明。

 

具体代码参看org.apache.nutch.seacher.QueryFilters<init>

1 )当第一次需要得到 QueryFilter 的一个子类的实例时,使用下面这句话试图获得所有的实例:

 

this.queryFilters =

(QueryFilter[]) conf.getObject(QueryFilter.class .getName());

 

2)如果为空,则试图从插件仓库中得到该插件的扩展点:

 

ExtensionPoint point = PluginRepository.get(conf)

            .getExtensionPoint(QueryFilter.X_POINT_ID);

 

PluginRepository.get(conf) 这句话中,返回插件仓库,如果仓库为空,会初始化所有插件:

 

初始化所有插件PluginRepository.<init>

     试图从缓存内获得插件仓库。

PluginRepository result = (PluginRepository)CACHE.get(conf);

     如果未获得,则初始化所有插件

result = new PluginRepository(conf);

l         初始化以活动插件和扩展点的集合

fActivatedPlugins = new HashMap();

      fExtensionPoints = new HashMap();

      this.conf = conf;

l         获得插件存放位置

      String[] pluginFolders = conf.getStrings("plugin.folders");

l         实例化PluginManifestParser

   PluginManifestParser manifestParser =  new PluginManifestParser(conf, this);

   PluginManifestParser 是一个封装了PluginRepository的工具类,在构造时,分析每个插件的文件夹,把每个plugin.xml文件的内容进行分析,记录了所有的插件接口和插件接口内所包含的所有实现类的关系。

l         放入缓存

   CACHE.put(conf, result);

 

Plugin.xml 描述内容见附录一

 

3)获得所有QueryFilter的子类描述。

Extension[] extensions = point.getExtensions();

 

4)循环获得每个插件的两个参数,fieldNamerawFieldNames,生成每个filter插件实例。

for (int i = 0; i < extensions.length; i++) {

          Extension extension = extensions[i];

          ArrayList fieldNames = parseFieldNames(extension, "fields");

          ArrayList rawFieldNames = parseFieldNames(extension, "raw-fields");

          if (fieldNames.size() == 0 && rawFieldNames.size() == 0) {

            if (LOG.isWarnEnabled()) {

              LOG.warn("QueryFilter: " + extension.getId()

                     + " names no fields.");

            }

            continue;

          }

          filters[i] = (QueryFilter) extension.getExtensionInstance();

          FIELD_NAMES.addAll(fieldNames);

          FIELD_NAMES.addAll(rawFieldNames);

          conf.setObject("FIELD_NAMES", FIELD_NAMES);

          RAW_FIELD_NAMES.addAll(rawFieldNames);

          conf.setObject("RAW_FIELD_NAMES", RAW_FIELD_NAMES);

        }

 
至此,所有实现QueryFilter的子类实例均被加载。如果需要开发自己的插件,同样可以参考这个过程,plugin.xml的具体内容的描述负在下面:

 

<?xml version="1.0" encoding="UTF-8"?>

 

<!— 插件的根元素,根元素的属性表明了一个插件的基本身份-->

<plugin id=” 唯一身份(被插件仓库作为身份标示)” name=”名称” version=”版本号

provider=” 作者”class=”类名(可选)”>

 

<!-- 以下两个内容中引用的类库,都是作为本类使用反射时生成实例所需要的类库-->

<runtime>

    <library name=" 运行时的类库">

         <!— 如果存在此元素,则保存到fExportedLibs(输出类库集合),否则存放到

fNotExportedLibs (非输出类库集合)-->

         <export name="*"/>

    </library>

</runtime>

 

<requires>

    <!— 需要注意,此处所需要的类库,包括该类库所需的类库,都不得在此引用本插件-->

    <import plugin=" 所需类库"/>

</requires>

 

<extension id=" 本类的包名(从代码中看没有被使用)"

              name=" 类名(从代码中看没有被使用)"

              point=" 扩展点类名(即接口名)">

      <implementation id=" 实现扩展的唯一标识(与类名相同,被parse-plugins.xml

作为身份表示使用)"

           class=" 实现扩展的类的类名"/>

      <parameter name=" 参数名"  value="参数值"/>

</extension>

 

<!— 仅在nutch-extensionpoints/plugin.xml中存在,一次性加载纪录下所有的扩展点的名称-->

< extension-point id=” 扩展点唯一标识”name=”扩展点名”/>

 

</plugin>


下次会写一个完整的plugin以供参考。

摘自http://www.blogjava.net/redmu/archive/2006/12/02/85092.html

 
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值