<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    天 霽

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

    Nutch插件加載分析

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

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

    ?

    具體代碼參看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)如果為空,則試圖從插件倉庫中得到該插件的擴(kuò)展點(diǎn):

    ?

    ExtensionPoint point = PluginRepository.get(conf)

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

    ?

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

    ?

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

    ???? 試圖從緩存內(nèi)獲得插件倉庫。

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

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

    result = new PluginRepository(conf);

    l???????? 初始化以活動插件和擴(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)容見附錄一

    ?

    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í)例均被加載。如果需要開發(fā)自己的插件,同樣可以參考這個(gè)過程,plugin.xml的具體內(nèi)容的描述負(fù)在下面:

    ?

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

    ?

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

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

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

    ?

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

    <runtime>

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

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

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

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

    ??? </library>

    </runtime>

    ?

    <requires>

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

    ??? <import plugin=" 所需類庫"/>

    </requires>

    ?

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

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

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

    ????? <implementation id=" 實(shí)現(xiàn)擴(kuò)展的唯一標(biāo)識(與類名相同,被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)識”name=”擴(kuò)展點(diǎn)名”/>

    ?

    </plugin>


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

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


    評論

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

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

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

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

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

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

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

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

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

    2007-10-23 23:08 by 零度竹緣
    當(dāng)某個(gè)插件需要被加載時(shí),Nutch會加載所有插件的相關(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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲无线一二三四区| 日韩亚洲翔田千里在线| 日韩亚洲国产高清免费视频| 亚洲爆乳无码专区www| 久久影视国产亚洲| 成人在线免费看片| 曰批免费视频播放免费| 91亚洲精品第一综合不卡播放| 日韩免费视频播放| 曰批全过程免费视频在线观看无码| 亚洲国产精品xo在线观看| 亚洲国产成人精品女人久久久| 精品无码AV无码免费专区| 337p日本欧洲亚洲大胆人人| 亚洲va国产va天堂va久久| 在线观着免费观看国产黄| 久久成人免费电影| 国产亚洲精品免费| 亚洲精品国产免费| 久久综合亚洲色HEZYO国产| 免费无码AV电影在线观看| a级片免费观看视频| 亚洲成av人无码亚洲成av人| 久久久久亚洲av无码尤物| 四虎影视在线永久免费观看| 91久久青青草原线免费| 全部一级一级毛片免费看| 久久亚洲最大成人网4438| 久久精品国产精品亚洲精品| 日本特黄a级高清免费大片| 免费无码成人AV在线播放不卡| 日本高清不卡中文字幕免费| 亚洲人成人77777在线播放| 精品久久久久久亚洲| 免费大片在线观看网站| 最近2019中文字幕免费看最新| 久久久久久AV无码免费网站| 久久久WWW免费人成精品| 国产精品久久亚洲一区二区| wwwxxx亚洲| 亚洲成人黄色在线观看|