分布式Hibernate search詳解
分布式Hibernate Search與Apache Tomcat6,ActiveMQ 和Spring.今天我將跟大家分享我的經(jīng)驗(yàn),以master/slave(s)方式配置分布式Hibernate Search并整合Apache ActiveMQ,Spring,應(yīng)用程序額容器是Apache Tomcat 6。
怎么工作:
-Hibernate Search 支持使用JMS back-end 和 master/slave(s) 索引進(jìn)行分布式配置
- mater通過網(wǎng)絡(luò)共享暴露索引 (例如通過NFS。。。)
- slave(s) 復(fù)制mater的索引到本地
版本
- Apache Tomcat 6.0.20
- Hibernate Search 3.1.1 GA
- Apache ActiveMQ 5.3.0
- Spring 2.5.6
- XBean-Spring 3.6
${local.index.dir} - directory to store master index
${master.index.dir} - directory to copy master index to, it's shared network location for replication with slave(s)
Mater索引的配置
Mater的配置稍顯復(fù)雜。以下是配置屬性說明
$(local.index.dir) - 存儲(chǔ)mater索引的目錄
$(master.index.dir) -拷貝mater索引的目標(biāo)目錄,通過網(wǎng)絡(luò)定位供slave(s)復(fù)制。
首先,為了簡(jiǎn)單起見,我們將ActiveMQ中介運(yùn)行在同一臺(tái)服務(wù)器上。因此,我們?cè)赪EB-INF/activemq.xml文件中使用簡(jiǎn)單的嵌入式中介配置。
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd"> <amq:broker brokerName="HibernateSearchBroker"> <amq:managementContext> <amq:managementContext createConnector="false"/> </amq:managementContext> <amq:transportConnectors> <amq:transportConnector uri="tcp://localhost:61616" /> </amq:transportConnectors> </amq:broker> <amq:queue name="queue/hibernatesearch" physicalName="hibernateSearchQueue" /> </beans>
其次,需要在web application MEAT-INF/context.xml(Tocmat)中配置配置JNDI資源(JMS Connection Factory 和 Quene)
<!-- ActiveMQ ConnectionFactory --> <Resource name="jms/ConnectionFactory" auth="Container" type="org.apache.activemq.ActiveMQConnectionFactory" description="JMS Connection Factory" factory="org.apache.activemq.jndi.JNDIReferenceFactory" brokerURL="tcp://0.0.0.0:61616?trace=true" brokerName="HibernateSearchBroker" /> <!-- ActiveMQ HibernateSearch queue --> <Resource name="queue/hibernatesearch" auth="Container" type="org.apache.activemq.command.ActiveMQQueue" description="Hibernate search queue" factory="org.apache.activemq.jndi.JNDIReferenceFactory" physicalName="hibernateSearchQueue" />
接下來在Hibernate.cfg.xml文件中配置Hibernate Searc
<property name="hibernate.search.default.directory_provider">org.hibernate.search.store.FSMasterDirectoryProvider</property> <property name="hibernate.search.default.indexBase">${local.index.dir}</property> <property name="hibernate.search.default.sourceBase">${master.index.dir}</property> <property name="hibernate.search.default.refresh">60</property>
Master和slave之間代碼的一個(gè)重要區(qū)別是:master中必須包含實(shí)現(xiàn) AbstractJMSHibernateSearchController 的子類作為監(jiān)聽器,例如
import javax.jms.MessageListener; import org.hibernate.Session; import org.hibernate.search.backend.impl.jms.AbstractJMSHibernateSearchController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class JMSHibernateSearchController extends AbstractJMSHibernateSearchController implements MessageListener { @Override protected void cleanSessionIfNeeded(Session session) { // clean session here ... } @Override protected Session getSession() { // return new session here ... } }
最后在Spring的配置文件applicationContext.xml文件中,加入以下配置
<bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean"> <property name="config" value="WEB-INF/activemq.xml" /> <property name="start" value="true" /> </bean> <bean name="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:comp/env/jms/ConnectionFactory" /> </bean> <bean name="jmsHibernateSearchQueue" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:comp/env/queue/hibernatesearch" /> <bean id="hibernateSearchController" class="<your implementation of AbstractJMSHibernateSearchController>" /> <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer" depends-on="broker"> <property name="connectionFactory" ref="jmsConnectionFactory"/> <property name="destination" ref="jmsHibernateSearchQueue"/> <property name="messageListener" ref="hibernateSearchController" /> </bean>
With those configurations in place Hibernate Search master is ready to run.
正確配置好之后,Hibernate Search master就可以運(yùn)行了。
Slave 索引配置
Slave(s)的配置要簡(jiǎn)單得多,以下是配置屬性說明
${server} - 運(yùn)行ActiveMQ中介服務(wù)器
${lcoal.index.dir} - 存儲(chǔ)本地索引的目錄(master的拷貝)
${mater.index.share}-掛載mater索引的網(wǎng)絡(luò)共享目錄.
首先,我們需要在網(wǎng)站應(yīng)用 MEAT-INF/context.xml(Tocmat)中配置配置JNDI資源(JMS Connection Factory 和 Quene)
... <!-- ActiveMQ ConnectionFactory --> <Resource name="jms/ConnectionFactory" auth="Container" type="org.apache.activemq.ActiveMQConnectionFactory" description="JMS Connection Factory" factory="org.apache.activemq.jndi.JNDIReferenceFactory" brokerURL="tcp://${server}:61616?trace=true" brokerName="HibernateSearchBroker" /> <!-- ActiveMQ HibernateSearch queue --> <Resource name="queue/hibernatesearch" auth="Container" type="org.apache.activemq.command.ActiveMQQueue" description="Hibernate search queue" factory="org.apache.activemq.jndi.JNDIReferenceFactory" physicalName="hibernateSearchQueue" /> ...
接下來我們需要在hibernate.cfg.xml中配置Hibernate Search
<property name="hibernate.search.default.directory_provider">org.hibernate.search.store.FSSlaveDirectoryProvider</property> <property name="hibernate.search.default.indexBase">${local.index.dir}</property> <property name="hibernate.search.default.sourceBase">${master.index.share}</property> <property name="hibernate.search.default.refresh">60</property> <property name="hibernate.search.worker.backend">jms</property> <property name="hibernate.search.worker.jms.connection_factory">java:comp/env/jms/ConnectionFactory</property> <property name="hibernate.search.worker.jms.queue">java:comp/env/queue/hibernatesearch</property> <property name="hibernate.search.worker.jndi.java.naming.factory.initial">org.apache.activemq.jndi.ActiveMQInitialContextFactory</property>
配置到此結(jié)束
說些關(guān)于JUnit測(cè)試的題外話.唯一的問題是需要使用Spring JNDI templates模擬JNDI,例如
<bean name="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:comp/env/jms/ConnectionFactory" /> <property name="jndiTemplate"> <bean class="org.springframework.mock.jndi.ExpectedLookupTemplate"> <constructor-arg index="0" value="java:comp/env/jms/ConnectionFactory" /> <constructor-arg index="1"> <bean class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL"> <value>tcp://0.0.0.0:61616</value> </property> </bean> </constructor-arg> </bean> </property> </bean> <bean name="jmsHibernateSearchQueue" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:comp/env/queue/hibernatesearch" /> <property name="jndiTemplate"> <bean class="org.springframework.mock.jndi.ExpectedLookupTemplate"> <constructor-arg index="0" value="java:comp/env/queue/hibernatesearch" /> <constructor-arg index="1"> <bean id="jmsHibernateSearchQueue" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg value="queue/hibernateSearchQueue"/> </bean> </constructor-arg> </bean> </property> </bean>
總結(jié)
以上就是本文關(guān)于分布式Hibernate search詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:Hibernate實(shí)現(xiàn)悲觀鎖和樂觀鎖代碼介紹、Hibernate核心思想與接口簡(jiǎn)介等,有什么問題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的,感謝朋友們對(duì)本站的支持!
相關(guān)文章
Cache-control使用Cache-control:private學(xué)習(xí)筆記
網(wǎng)頁緩存由 HTTP消息頭中的Cache-control控制,常見取值有private、no-cache、max-age、must- revalidate等,默認(rèn)為private2013-02-02搭建RocketMQ在本地IDEA開發(fā)調(diào)試環(huán)境教程
這篇文章主要為大家介紹了搭建RocketMQ在本地IDEA開發(fā)調(diào)試環(huán)境的步驟教程詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02ssh更改默認(rèn)端口號(hào)及實(shí)現(xiàn)免密碼遠(yuǎn)程登錄
這篇文章主要介紹了ssh更改默認(rèn)端口號(hào)及實(shí)現(xiàn)免密碼遠(yuǎn)程登錄的相關(guān)資料,需要的朋友可以參考下2017-10-10在Windows與Linux下禁止被ping的設(shè)置方法[推薦]
LINUX下禁止ping命令的方法與windows下禁止ping的設(shè)置方法,非常的全,推薦大家參考下。2011-03-03Ubuntu移動(dòng)任務(wù)欄到底部的實(shí)現(xiàn)方式
在Ubuntu操作系統(tǒng)中,默認(rèn)的任務(wù)欄位置在屏幕左側(cè),本文介紹了兩種方法來將任務(wù)欄移動(dòng)到底部,方法一涉及使用終端命令,可能會(huì)出現(xiàn)架構(gòu)不支持的情況,方法二通過設(shè)置界面調(diào)整Dock的位置來實(shí)現(xiàn)任務(wù)欄的移動(dòng),具體步驟包括打開設(shè)置、選擇外觀選項(xiàng)2024-09-09CentOS簡(jiǎn)單操作命令及node.js的安裝方法
這篇文章主要介紹了CentOS簡(jiǎn)單操作命令及node.js的安裝方法,列舉了CentOS的常用查看命令及安裝node.js的方法,需要的朋友可以參考下2016-05-05