`
wangxuliangboy
  • 浏览: 208098 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论
阅读更多

Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架.

Compass实现了通过注册Hibernate的相关事件实现了数据的实时索引..

我写Spring+Compass+Hibernate做了一个例子..通过这个例子顺便看了下源码.

 

<bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"  init-method="start" destroy-method="stop"> 

  <property name="compass" ref="compass" /> 
        <property name="gpsDevices"> 
            <list> 
                <ref local="hibernateGpsDevice" /> 
            </list> 
        </property> 
</bean>

<bean id="hibernateGpsDevice"  class="org.compass.spring.device.hibernate.dep.SpringHibernate3GpsDevice"> 
        <property name="name"> 
            <value>hibernateDevice</value> 
        </property> 
        <property name="sessionFactory" ref="sessionFactory" /> 
</bean>

 

 SingleCompassGps 在初始化的时候会调用init-method属性配置的start方法..

这个方法在SingleCompassGps的父类AbstractCompassGps中. 而start方法会返回调用SingleCompassGps

的doStart方法.通过CompassSettings设置Compass的一些默认的相关环境属性..我们也可以在配置SingleCompassGps的时候配置indexSettings属性。。

当属性设法完成之后会运行下面这段话:

for (CompassGpsDevice device : devices.values()) {
                device.start();
}

调用SingleCompassGps中配置的gpsDevices属性。循环调用里面的start方法。。

而在SpringHibernate3GpsDevice类的start方法。这个方法主要用来注册Hibernate 的相关事件。。

Hibernate3.0与Hibernate3.1中事件集合类为SessionEventListenerConfig,EventListeners。

当通过Hibernate插入,更新,删除分别会触发PostInsertEventListener,PostUpdateEventListener,PostDeleteEventListener

会分别调用onPostInsert,onPostUpdate,onPostDelete方法

 

当通过Spring的HibernateTemplate.save方法来保存entity时,会调用刚注册的postInsert方法。。

然后会调用singleCompassGps的executeForMirror方法。。并传入CompassCallback回调类实例。

executeForMirror方法会调用CompassTemplate的execute(并传入CompassCallback)

在CompassTemplate的execute方法中会获得CompassSession.

 

Compass索引一条记录分为三步。。

一。通过CompassSession.beginTransaction会来开起事务。。(调用LuceneSearchEngine来开启事务.具体得看SpringSyncTransaction.begin方法)

二。调用回调的doInCompass方法。(1。将CPM.xml文件中配置的是映射列与Lucene的Field对应起来。

2。调用CompassSession.create方法---LuceneSearchEngine.createOrUpdate----transIndexManager.create(resource, analyzer)---在create的时候会建立一个Lucene RAMDirectory,将Document往内存里面写)

 三。事务提交(Transaction.doCommit方法。----CommitCallable.call方法。这个方法会先判断是否有内存索引。如果有的话。就会通过IndexWriter.addIndex方法将内存索引与FSDirectory索引合并)

FSDirectory索引路径为LuceneSearchEngineStore.openDirectory(subIndex) //subIndex就是cpm.xml中的别名

 

在这三步中其实还有些很复杂的东东。。有兴趣的话,可以一起聊聊

 

分享到:
评论
1 楼 quasimodo_es 2013-01-23  
你好,我在compass + terracotta 整合的时候,发现每次重启项目,compass都会重建索引,这个问题你遇到过吗?如何解决,请教一下

相关推荐

    跋山涉水解析compass官方sample

    NULL 博文链接:https://exceljava.iteye.com/blog/324846

    px4飞控磁罗盘校准算法理论与代码结合解读

    px4飞控磁罗盘校准算法理论与代码结合解读,有分析图解,有代码注释,有理论有实践

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    JAVA上百实例源码以及开源项目源代码

    Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来...

    java源码包2

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包3

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包4

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    JAVA上百实例源码以及开源项目

    笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...

    java开源包8

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包1

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包11

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包2

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包3

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包6

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包5

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包10

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

Global site tag (gtag.js) - Google Analytics