3

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

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

<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,我没有任何添加逻辑来正确设置参数的能力。

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

谢谢!

4

1 回答 1

0

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

另一种方法是编写自己的DirectoryProvider。查看org.hibernate.search.store.impl.FSMasterDirectoryProviderorg.hibernate.search.store.impl.FSSlaveDirectoryProvider并根据您可以在机器上读取的标志编写一个可以充当从属或主控的提供程序。

于 2012-11-27T08:30:17.540 回答