详析 Jackrabbit 各个模块 (一)

时间:2022-09-27 03:12:48
最近做的工作与Jackrabbit有一定的联系,所以看了一部分Jackrabbit的代码。我的这方面的工作会一直持续,所以有关Jackrabbit的文章也会多写几篇。

从jackrabbit.apache.org把Jackrabbit源代码下载下来,它把各模块分为好几个类包,在本文,我所讲的是Jackrabbit的核心包 jackrabbit-core.

无论你以哪种方式来使用Jackrabbit, jackrabbit-core包必不可少。jackrabbit-core包负责文件的存储,索引的建立。如果有cluster, core包还要负责Jackrabbit集群方面的工作。好,接下来,我们以如下几个主题展开来讲。

1. Node Type : org/apache/jackrabbit/core/nodetype
   node type 定义内容的存储格式,众所周知,Jackrabbit是JSR 170 或 JSR 283 JCR 的一个实际。 那么它就要以树状的节点来存储内容,节点下面可以有子节点也可以没有, 节点下面还可以有属性。 属性里面存储文本的或是二进制的内容,在Jackrabbit 里面称之为Value.

Jackrabbit将节点类型定义在一个XML里面, 如下:

下面是摘自 org/apache/jackrabbit/core/nodetype/builtin_nodetypes.xml 的一个片断:

    <nodeType name="nt:file" isMixin="false" hasOrderableChildNodes="false" primaryItemName="jcr:content">
        <supertypes>
            <supertype>nt:hierarchyNode</supertype>
        </supertypes>
        <childNodeDefinition name="jcr:content" defaultPrimaryType="" autoCreated="false" mandatory="true" onParentVersion="COPY" protected="false" sameNameSiblings="false">
            <requiredPrimaryTypes>
                <requiredPrimaryType>nt:base</requiredPrimaryType>
            </requiredPrimaryTypes>
        </childNodeDefinition>
    </nodeType>


有了Node Type的定义,Jackrabbit 的存储才有章可循, 只有按照指定的格式存储,数据的完整性,合理性,交换性才可能得到保障。

2 Item State : org/apache/jackrabbit/core/state
 
  在核心层,Jackrabbit以Item State来管理内存中的临时数据,以保存数据为例,应用层将数据封将成 Item, core 核心将 Item 转换为 Item State, 然后将 State 持久到DB或是文件系统

   Item State 的持久化过程可分为Session, Local, Share 三层。 Session层收集应用层数据经 Local 层到Share 层, Share 层检测冲突并 与  持久层原数据进行合并然后将合并结果持久化到 持久层。


3 版本

4 Search Manager:
  
   搜索是Jackrabbit很重要的一块,它基于Lucene, 可采用XML或SQL构建语法树来进行搜索。

5 事件机制
  
   一个Node 或是 Property 产生 CRUD 的操作都会有相应的事件产生,事件的消费者会对事件进行消费。 在Jackrabbit 里面,搜索模块的索引建立就有赖于事件机制, 如果将Jackrabbit的集群功能启用起来,事件机制还可帮助Jackrabbit保持Cache同步。


6. 锁/并发

    Jackrabbit中的锁机制可保证Jackrabbit的各项操作的完整性。

这6部分我将分为五篇文章进行详解,敬请留意。