天 霽

          那天風(fēng)大,搜搜的
          posts - 4, comments - 36, trackbacks - 1, articles - 1
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          日歷

          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          隨筆分類

          文章檔案

          test

          搜索

          •  

          最新評(píng)論

          Nutch插件加載分析

          Posted on 2006-12-02 21:39 天霽 閱讀(2633) 評(píng)論(5)  編輯  收藏

          ?? 當(dāng)某個(gè)插件需要被加載時(shí), Nutch 會(huì)加載所有插件的相關(guān)接口到緩存,此后每個(gè)插件需要實(shí)例的時(shí)候,根據(jù)相關(guān)接口和相關(guān)接口實(shí)現(xiàn)實(shí)例在緩存內(nèi)的記錄,使用反射實(shí)現(xiàn)一個(gè)實(shí)例并返回,下面以 QueryFilter 的所有插件被加載例子進(jìn)行說(shuō)明。

          ?

          具體代碼參看org.apache.nutch.seacher.QueryFilters<init>

          1 )當(dāng)?shù)谝淮涡枰玫?/span> QueryFilter 的一個(gè)子類的實(shí)例時(shí),使用下面這句話試圖獲得所有的實(shí)例:

          ?

          this.queryFilters =

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

          ?

          2)如果為空,則試圖從插件倉(cāng)庫(kù)中得到該插件的擴(kuò)展點(diǎn):

          ?

          ExtensionPoint point = PluginRepository.get(conf)

          ??????????? .getExtensionPoint(QueryFilter.X_POINT_ID);

          ?

          PluginRepository.get(conf) 這句話中,返回插件倉(cāng)庫(kù),如果倉(cāng)庫(kù)為空,會(huì)初始化所有插件:

          ?

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

          ???? 試圖從緩存內(nèi)獲得插件倉(cāng)庫(kù)。

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

          ???? 如果未獲得,則初始化所有插件

          result = new PluginRepository(conf);

          l???????? 初始化以活動(dòng)插件和擴(kuò)展點(diǎn)的集合

          fActivatedPlugins = new HashMap();

          ????? fExtensionPoints = new HashMap();

          ????? this.conf = conf;

          l???????? 獲得插件存放位置

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

          l???????? 實(shí)例化PluginManifestParser

          ? ?PluginManifestParser manifestParser =? new PluginManifestParser(conf, this);

          ?? PluginManifestParser 是一個(gè)封裝了PluginRepository的工具類,在構(gòu)造時(shí),分析每個(gè)插件的文件夾,把每個(gè)plugin.xml文件的內(nèi)容進(jìn)行分析,記錄了所有的插件接口和插件接口內(nèi)所包含的所有實(shí)現(xiàn)類的關(guān)系。

          l???????? 放入緩存

          ?? CACHE.put(conf, result);

          ?

          Plugin.xml 描述內(nèi)容見(jiàn)附錄一

          ?

          3)獲得所有QueryFilter的子類描述。

          Extension[] extensions = point.getExtensions();

          ?

          4)循環(huán)獲得每個(gè)插件的兩個(gè)參數(shù),fieldNamerawFieldNames,生成每個(gè)filter插件實(shí)例。

          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);

          ??? ????}

          ?
          至此,所有實(shí)現(xiàn)QueryFilter的子類實(shí)例均被加載。如果需要開(kāi)發(fā)自己的插件,同樣可以參考這個(gè)過(guò)程,plugin.xml的具體內(nèi)容的描述負(fù)在下面:

          ?

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

          ?

          <!— 插件的根元素,根元素的屬性表明了一個(gè)插件的基本身份-->

          <plugin id=” 唯一身份(被插件倉(cāng)庫(kù)作為身份標(biāo)示)” name=”名稱” version=”版本號(hào)

          provider=” 作者”class=”類名(可選)”>

          ?

          <!-- 以下兩個(gè)內(nèi)容中引用的類庫(kù),都是作為本類使用反射時(shí)生成實(shí)例所需要的類庫(kù)-->

          <runtime>

          ??? <library name=" 運(yùn)行時(shí)的類庫(kù)">

          ??????? ?<!— 如果存在此元素,則保存到fExportedLibs(輸出類庫(kù)集合),否則存放到

          fNotExportedLibs (非輸出類庫(kù)集合)-->

          ???????? <export name="*"/>

          ??? </library>

          </runtime>

          ?

          <requires>

          ??? <!— 需要注意,此處所需要的類庫(kù),包括該類庫(kù)所需的類庫(kù),都不得在此引用本插件-->

          ??? <import plugin=" 所需類庫(kù)"/>

          </requires>

          ?

          <extension id=" 本類的包名(從代碼中看沒(méi)有被使用)"

          ????????????? name=" 類名(從代碼中看沒(méi)有被使用)"

          ????????????? point=" 擴(kuò)展點(diǎn)類名(即接口名)">

          ????? <implementation id=" 實(shí)現(xiàn)擴(kuò)展的唯一標(biāo)識(shí)(與類名相同,被parse-plugins.xml

          作為身份表示使用)"

          ?????????? class=" 實(shí)現(xiàn)擴(kuò)展的類的類名"/>

          ????? <parameter name=" 參數(shù)名"? value="參數(shù)值"/>

          </extension>

          ?

          <!— 僅在nutch-extensionpoints\plugin.xml中存在,一次性加載紀(jì)錄下所有的擴(kuò)展點(diǎn)的名稱-->

          < extension-point id=” 擴(kuò)展點(diǎn)唯一標(biāo)識(shí)”name=”擴(kuò)展點(diǎn)名”/>

          ?

          </plugin>


          下次會(huì)寫一個(gè)完整的plugin以供參考。

          轉(zhuǎn)載請(qǐng)注明出處。


          評(píng)論

          # re: Nutch插件加載分析  回復(fù)  更多評(píng)論   

          2006-12-04 14:37 by jumpjump
          頂!!很有參考價(jià)值!謝謝天霽~!

          # re: Nutch插件加載分析  回復(fù)  更多評(píng)論   

          2006-12-04 14:38 by jumpjump
          頂!很有參考價(jià)值!謝謝天霽!!!

          # re: Nutch插件加載分析  回復(fù)  更多評(píng)論   

          2006-12-04 14:46 by jumpjump
          期待下一篇!!
          請(qǐng)問(wèn)天霽,我根據(jù)plugin的指南寫了個(gè)plugin,但是如何對(duì)代碼進(jìn)行調(diào)試?自己寫一個(gè)main?那Content content, Parse parse, HTMLMetaTags metaTags, DocumentFragment doc這幾個(gè)類該如何定義呢?謝謝。

          # re: Nutch插件加載分析  回復(fù)  更多評(píng)論   

          2007-03-30 18:10 by 好,非常好
          好,很好。謝謝!

          # Nutch插件加載分析【轉(zhuǎn)】[TrackBack]  回復(fù)  更多評(píng)論   

          2007-10-23 23:08 by 零度竹緣
          當(dāng)某個(gè)插件需要被加載時(shí),Nutch會(huì)加載所有插件的相關(guān)接口到緩存,此后每個(gè)插件需要實(shí)例的時(shí)候,根據(jù)相關(guān)接口和相關(guān)接口實(shí)現(xiàn)實(shí)例在緩存內(nèi)的記錄,使用反射實(shí)現(xiàn)一個(gè)實(shí)例并返回,下面以QueryFilte...
          [引用提示]零度竹緣引用了該文章, 地址: http://www.cnweblog.com/nm1504/archive/2007/10/23/258204.html

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 常德市| 铅山县| 蒲江县| 库尔勒市| 德化县| 霍城县| 高邮市| 平安县| 海宁市| 那曲县| 巨鹿县| 法库县| 界首市| 西林县| 兴宁市| 镇康县| 汶川县| 射洪县| 泾川县| 广东省| 蒙阴县| 漳州市| 乌恰县| 乐至县| 涿鹿县| 双柏县| 泉州市| 额济纳旗| 阿坝| 垦利县| 逊克县| 天峻县| 杭州市| 邵武市| 衡阳县| 景泰县| 长沙县| 洛宁县| 皋兰县| 申扎县| 重庆市|