BroadLeaf项目集成SolrCloud

BroadLeaf项目搜索功能改进》一文中介绍了 BroadLeaf 项目中如何改进搜索引擎这一块的代码,其中使用的是单节点的 solr 服务器,这篇文章主要介绍 BroadLeaf 项目如何集成 SolrCloud 集群。

1、SolrCloud环境搭建

参考 《Apache SolrCloud安装》,搭建Solr集群环境,将 Demosite 所用的 Solr 配置文件 solrconfig.xml 和 schema.xml 上传到 zookeeper 集群中,保证成功启动 Solr 集群。

2、扩展SearcheService类

扩展SearchService类的步骤与单节点集成一致,此处不再叙述。

3、修改Solr相关配置文件

a) 删除site模块中的site/src/main/webapp/WEB-INF/applicationContext.xml中的以下代码:

<bean id="solrEmbedded" class="java.lang.String">
          <constructor-arg value="solrhome"/>
</bean>
<bean id="blSearchService" class="org.broadleafcommerce.core.search.service.solr.SolrSearchServiceImpl">
        <constructor-arg name="solrServer" ref="${solr.source}" />
        <constructor-arg name="reindexServer" ref="${solr.source.reindex}" />
</bean>

b)删除site模块的site/src/main/resources/runtime-properties/common.properties中以下代码:

solr.source=solrEmbedded
solr.source.reindex=solrEmbedded

c)在core模块中core/src/main/resources/applicationContext.xml添加如下代码:

<bean id="solrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
        <constructor-arg value="${solr.url}"/>
        <property name="defaultCollection" value="product" />
        <property name="zkClientTimeout" value="20000" />
        <property name="zkConnectTimeout" value="1000" />
</bean>
<bean id="solrReindexServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
        <constructor-arg value="${solr.url.reindex}" />
        <property name="defaultCollection" value="product" />
        <property name="zkClientTimeout" value="20000" />
        <property name="zkConnectTimeout" value="1000" />
</bean>
<bean id="blSearchService"         class="org.broadleafcommerce.core.search.service.solr.ExtSolrSearchServiceImpl">
        <constructor-arg name="solrServer" ref="${solr.source}" />
        <constructor-arg name="reindexServer" ref="${solr.source.reindex}"/>
</bean>

注:上述配置中的defaultCollection的值product对应solr集群的collection名字,根据实际情况修改此处的值。

d) 在 core模块中core/src/main/resources/runtime-properties/common-shared.properties添加如下代码:

solr.url=192.168.56.121\:2181,192.168.56.122\:2181,1192.168.56.123\:2181
solr.url.reindex=192.168.56.121\:2181,192.168.56.122\:2181,1192.168.56.123\:2181
solr.source=solrServer
solr.source.reindex=solrReindexServer

4、重写rebuildIndex方法

在core模块的org.broadleafcommerce.core.search.service.solr包下添加LLSolrIndexServiceImpl,重写源码broadleaf-framework/SolrIndexServiceImpl中的rebuildIndex()方法,屏蔽如下代码:

//      // Swap the active and the reindex cores
//      shs.swapActiveCores();
//      // If we are not in single core mode, we delete the documents for the unused core after swapping
//      if (!SolrContext.isSingleCoreMode()) {
//          deleteAllDocuments();
//      }

5、修改定时任务

web系统启动时候,会查询数据库中商品,然后重建索引。该功能在applicationContext.xml中已经定义了定时任务,修改rebuildIndexJobDetail中的targetObject,对应rebuildIndex所在的服务类,如下:

~~~xml


如果需要手动创建索引,则需要取消applicationContext.xml中定义的定时任务,步骤如下:

  a)去掉如下代码:

~~~xml
<bean id="rebuildIndexJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="blSearchService" />
    <property name="targetMethod" value="rebuildIndex" />
</bean>
<bean id="rebuildIndexTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <property name="jobDetail" ref="rebuildIndexJobDetail" />
    <property name="startDelay" value="${solr.index.start.delay}" />
    <property name="repeatInterval" value="${solr.index.repeat.interval}" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
     <list>
        <ref bean="rebuildIndexTrigger" />
     </list>
    </property>
</bean>

b)编写main方法,打成jar包,然后编写shell脚本,用于手动重建索引或者设置定时任务。该类需要获取一个名称为blSearchService的bean,然后调用该bean的rebuildIndex方法,主要代码如下:

@Resource(name = "blSearchService")
private SearchService extSolrSe earchService;
public void doRebuild(){
    extSolrSearchService.rebuildIndex();
}

6、扩展CatalogService

添加如下代码:

@Resource(name = "blSearchService")
private ExtSolrSearchService extSolrSearchService;

修改该类的saveProduct方法如下:

@Override
@Transactional("blTransactionManager")
public Product saveProduct(Product product) {
    Product dbProduct = catalogService.saveProduct(product);
    try {
        extSolrSearchService.addProductIndex(dbProduct);
    } catch (ServiceException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }
    return dbProduct;
}
时间: 2024-08-14 06:43:27

BroadLeaf项目集成SolrCloud的相关文章

BroadLeaf项目搜索功能改进

Broadleaf Commerce 是一个开源的Java电子商务平台,基于Spring框架开发,提供一个可靠.可扩展的架构,可进行深度的定制和快速开发. 关于Solr Broadleaf项目中关于商品的搜索使用了嵌入式的Solr服务器,这个从配置文件中可以看出来. 项目主页: http://www.broadleafcommerce.com/ 示例网站: http://demo.broadleafcommerce.org/ 示例网站源代码: https://github.com/Broadle

项目集成Maven后JUnit报ClassNotFoundException错误原因及解决方法

前提:原有项目一切运行正常,单元测试正常执行. 项目开始使用Maven管理,结果发现原有的JUnit测试无法执行,类无法找到(java.lang.ClassNotFoundException).无论如何修改Maven配置,报错依然. 分析原因: MyEclipse之所以能识别项目,是根据.project文件解析:而项目的目录结构则是在.classpath文件中定义.MyEclipse的JUnit插件也是根据以上文件来查找源代码和class文件的存放目录.项目集成Maven后,通过执行maven命

java-eclipse中多个maven项目集成和maven启动问题

问题描述 eclipse中多个maven项目集成和maven启动问题 多个maven object 每次都要install所有的jar 发布才不会报错. 而且修改一个简单的页面都要重启. 那位大神指导指导

JAVA WEB项目集成海康SDK

问题描述 JAVA WEB项目集成海康SDK JAVA WEB项目中如何在JSP页面中回放.下载远程服务器上的海康的历史监控视频?哪位大侠有做过啊,最好能直接通过JS调用相关插件的方法就可以实现的,如果有示例代码就最好了,或者有已封装好的SDK也可以.跪谢.....注:是杭州海康威视的 解决方案 http://wenku.baidu.com/link?url=pWQbROcXrpDc6BJjugglypiHwzYfmc0a394gHE2okQUqUoL5FEPcXwkMg4cS2nlSi9uo7

java-报表 Java项目集成 支持导出word和pdf

问题描述 报表 Java项目集成 支持导出word和pdf 烦请大家推荐一下报表的插件啊,现在急需统计相关的包边插件来实现 数据的图表展示, 并且支持图表的导出,导出的格式是excel.word.pdf. 需要与Java的web项目集成.看了网上很多推荐的插件,觉得一头雾水, 劳烦大家结合自己的实际使用,推荐一下,有相关的教程最好了,谢谢啦~~~ 解决方案 eclipse 里 有个报表插件 birt 解决方案二: poi,itext这俩jar包好用

项目集成hibernate后,启动时报错java.lang.NoSuchMethodError

在项目集成hibernate后,启动时报错 org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'applicationInitializer' defined in file[D:\地址.class]: Invocation ofinit method failed; nested exception is java.lang.NoSuchMethodError:org.ap

项目集成方式成企业实施CRM项目规划的重点

CRM软件虽然是后起之秀,但是,在企业中普及的速度是非常的迅速.所以,企业在上CRM软件的时候,可能都已经实施过其他的信息化项目.如办公自动化系统.财务管理系统.甚至ERP系统等等.为此,企业就面临着一个两难的选择,是让CRM系统跟其他的信息化管理系统独立作战呢,还是让他们成为一个紧密合作的整体? 作为企业来说,他们当然希望这些信息化系统能够成为"相亲相爱的一家人".可是的是,现在CRM项目规划的时候,对这个问题考虑不足,使得后续项目集成的难度太大,成本也太高.不少企业不得不放弃项目的

项目集成EaseUI的错误,请求帮助!

问题描述 这是因为框架重复吗? 解决方案 http://www.imgeek.org/article/825307522建议参考这个去重新集成easeUI,是拖文件夹的方式集成easeUI.解决方案二:这是缺少什么框架呢?解决方案三:重新下载demo,将里面的这个第三方重新拖入自己的项目.

Java Groovlets和普通的Web项目集成

由于Groovy动态语言的方便性,如果想在普通的web项目中集成有两个选择 使用基于groovy的Grails框架,非常的方便,适用于新建的项目 使用groovy本身集成,适用已有项目的维护(毕竟按照grails的约定升级一个项目对于大的项目还是有很多的工作量的) 下文把实际涉及的一个项目维护使用groovy的过程总结一下: Web.xml配置:加入groovy响应的servlet <servlet> <servlet-name>Groovy</servlet-name>