plugins 机制

觉得这块也是蛮重要的,所以得要认真学了。

但检索到网上讲得不是很清楚,要么就是背书一样;要么 就是没深入到点子上。

这里可以说 是作为一种扩展吧,希望可以对那么有所额外的补充。

 

一.概念

PluginClassloader:利用self-defined的来指定具体的loader,只是名称变了,其实是URLClassLoader,因为plugin所依賴    的libs及files均转换file to url形式来加载的。

 

PluginRepository:plugin的管理类,可以说是代理吧,重头戏的是将所有的plugin.xml解析封装,所以它包含很多形如

PluginDescriptor,Plugin,Point等cached maps.

 

Plugin:在plugin.xml中,用户可以定义一个customerized的class(必须继承Plugin.java),来扩展默认的实现(默认的start(),shutdown()是不做任何事的)。所以其实就是一个plugin.xml对应一个Plugin.另外,它内置了PluginDescriptor,所以说,Plugin与PluginDescriptor是1对1关系.一个Plugin可以被安装和御载。

 

PluginDescriptor:与Plugin是对应的,它包含了一个plugin.xml的metadata,extension-points(只有nutch-extensinos/plugin.xml才有),exportedlibs,notexportedlibs,PluginClassloader等等。其实这此属性基本上就是xml中的属性。

 

ExtensionPoint:只有nutch-extensions/plugin.xml中才有此定义,它表明nutch的一个内置class或interface,用户真正扩展的是这些接口。当然了,因为一个point可以被多个customerized classes来实现,所以其中也含有若干extension(s)。

 

Extension:在一个plugin.xml中,可以有若干个extension元素 ;而每个元素下也可以有若干个implemention元素。这样的情况可以在若干个plugin.xml有同样的定义,那么Extension(s)可以认为是所有这些implemention(s)。即事实上,point与extension是1对多的关系。因而它包含Plugindescriptor,point,class和params等variables.

 

plugin.dtd:一个plugin.xml的document type definition

 

nutch-default.xml:包含plugin的excludes & includes plugin,加载plugins顺序等参数默认配置。

 

nutch-site.xml:site special configs

 

 

--举例说明--

QueryFilter:extension point

BasciQueryFilter: 具体的一个point实现之一

 

path-to-plugin/plugin.xml:真正的实现point(s)的所有配置文件

 

nutch-extension/plugin.xml:nutch core extension points,其它plugin.xml下的point值必须在这里定义过才起作用。

 

 

二. 配置/数据结构

nutch-extensions/plugin.xml

<plugin
   id="nutch-extensionpoints"
   name="the nutch core extension points"
   version="0.8.0"
   provider-name="nutch.org">

   <!-- this file hosts all extension points nutch core code offers. 
   Please not(note?) that plugins can define extension points as well to be extendable.
   这里的id就是相应plugin.xml下的extension.point属性!
   -->

<extension-point
      id="org.apache.nutch.clustering.OnlineClusterer"
      name="Nutch Online Search Results Clustering Plugin"/>

<extension-point
      id="org.apache.nutch.indexer.field.FieldFilter"
      name="Nutch Field Filter"/>
...
</plugin>
 

other plugin.xml,for example query-basic/plugin.xml:

<!--global:plugin (runtime?, requires?, extension-point*, extension*)-->
<!-- plugin:id,name,version are must;class is optiona

l -->
<plugin
   id="query-basic"
   name="Basic Query Filter"
   version="1.0.0"
   provider-name="nutch.org">
   
   <!--运行时由classloader加载和实例的包,可以说是由ant生成的包名;
   所以export表明此包应该导出的文件
   -->
   <runtime>
      <library name="query-basic.jar">
         <export name="*"/>
      </library>
   </runtime>

   <!--运行此plugin需要用到的依赖points;这里是nutch的core point-->
   <requires>
      <import plugin="nutch-extensionpoints"/>
   </requires>

   <!--extension:此plugin实现point的extention(s),point是必须的且在nutch-extensiionpoints/plugin.xml
   		中有定义;id可以不唯一,也没有用到 -->
   <!-- implementation:实现此point的类,both id and class are must 
   	  	实际处理时会将一个implemention作一个Extention实例处理,
   -->
   <!--  parameter:此extention在运行时用到的KV常量,可选但对extensino唯一 -->
   <extension id="org.apache.nutch.searcher.basic"
              name="Nutch Basic Query Filter"
              point="org.apache.nutch.searcher.QueryFilter">
      <implementation id="BasicQueryFilter"
                      class="org.apache.nutch.searcher.basic.BasicQueryFilter">
        <parameter name="fields" value="DEFAULT"/>
      </implementation>
      
   </extension>

</plugin>
 

nutch-site.xml

<property>
	  <name>plugin.includes</name>
	  <value>protocol-http|urlfilter-regex|parse-(text|html)|index-(basic|anchor)|query-(basic|site|url)|response-(json|xml)|summary-basic|scoring-(link|opic)|urlnormalizer-(pass|regex|basic)</value>
	  <description>NOTE:THIS VALUE MANYE HAVE BEEN CHANGED!.
	  </description>
</property>
	
<property>
	  <name>plugin.folders</name>
          <!-- crawl/产品环境-->
	  <value>plugins</value>
	 ....
</property>
...

 

 

 

三.运行流程


plugins 机制
 
plugins 机制
 
plugins 机制
 
plugins 机制

 

 

 

 

 

 

四.小结

插件这块也是繁锁的,刚看时会很晕,很多相关的类说明不够詳細,对应关系没说清楚。

不过话又说回来 ,其实想知道一个class的功能也容易的,只要看name和其中的fields也基本上清楚了,因为无非就是一个输入,处理,输出的过程;两者看看相关的methods就有个基本。

 

机制特点:

*使用lazy loading原则提交效率;

*使用1:n方式,只要定义好point,就可以在xml指定多个implementions,灵活方便;

*使用缓存形式提交效率;

*支持依赖性检查,避免代码重复冗余;

*灵活的过滤机制 ,减少直接代码处理引起 的风险;

 

 

 

references:

nutch plugin浅析

 

 

 

 

 

你可能感兴趣的:(plugins)