Spring + Hibernate Search动态配置

时间:2012-11-26 18:00:50

标签: spring hibernate hibernate-search

我目前正试图通过Spring在3台机器上配置hibernate搜索,以便使用JMS分布式索引。由于我们部署软件的方式,我必须在所有三台机器上使用相同的配置,但我需要一种方法将其中一台设置为JMS Master。

目前正在使用以下bean声明通过Spring配置hibernate:

<bean class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
id="productSessionFactory">
    <property name="dataSource">
        <ref local="productDataSource"/>
    </property>
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="entityInterceptor" ref="builderInterceptor"/>
    <property name="eventListeners">
        <map key-type="java.lang.String" value-type="java.lang.Object">
            <entry key="save" value-ref="saveEventListener"/>
        </map>
    </property>
</bean>

在三台机器中的一台上,我需要将属性hibernate.search.default.directory_provider设置为filesystem-master,另外两台我需要将它设置为filesystem-slave。

我能够在各台机器上设置标志,以确定哪台机器应该是主机,但由于所有配置都是XML,我没有任何能力添加逻辑来正确设置参数。

有没有办法以编程方式设置此参数,同时单独保留其余配置?

谢谢!

1 个答案:

答案 0 :(得分:0)

通常可以采用编程方式,但我不确定你在Spring中是如何做到这一点的。您不必将属性放入配置文件中,而是必须动态地(或至少部分动态地)构建属性并将其传递给 AnnotationSessionFactoryBean 。如果我没弄错的话,Spring SPI中有一些钩子可以允许你这样做,例如 BeanDefinitionRegistryPostProcessor

另一种方法是编写自己的 DirectoryProvider 。看一下 org.hibernate.search.store.impl.FSMasterDirectoryProvider org.hibernate.search.store.impl.FSSlaveDirectoryProvider 并编写一个可以充当奴隶的提供者或掌握取决于您可以在机器上阅读的标志。