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;
}
目录
相关文章
|
4月前
|
JavaScript 前端开发
如何在项目中集成 Babel?
如何在项目中集成 Babel?
73 3
|
2月前
|
安全 数据安全/隐私保护
DzzOffice:太完美啦,开源免费Word、Exce、PPT,多人同时协作,最主要还有免费的网盘,将这个项目集成到你的产品里面,项目立刻拥有整套offce解决方案
嗨,大家好,我是小华同学。DzzOffice是一个免费开源的企业协同办公平台,适合中小型企业及团队使用,功能涵盖网盘、文档、表格、演示文稿等,支持企业微信和钉钉移动办公,保障数据私有部署安全。 关注我们,获取更多优质开源项目和高效工作学习方法。
216 5
|
5月前
|
存储 JavaScript 数据库
ToB项目身份认证AD集成(一):基于目录的用户管理、LDAP和Active Directory简述
本文介绍了基于目录的用户管理及其在企业中的应用,重点解析了LDAP协议和Active Directory服务的概念、关系及差异。通过具体的账号密码认证时序图,展示了利用LDAP协议与AD域进行用户认证的过程。总结了目录服务在现代网络环境中的重要性,并预告了后续的深入文章。
148 2
|
5月前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
129 1
|
5月前
|
jenkins Shell 持续交付
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(二)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(二)
145 0
|
5月前
|
安全 Java 测试技术
ToB项目身份认证AD集成(二):快速搞定window server 2003部署AD域服务并支持ssl
本文详细介绍了如何搭建本地AD域控测试环境,包括安装AD域服务、测试LDAP接口及配置LDAPS的过程。通过运行自签名证书生成脚本和手动部署证书,实现安全的SSL连接,适用于ToB项目的身份认证集成。文中还提供了相关系列文章链接,便于读者深入了解AD和LDAP的基础知识。
168 0
|
5月前
|
Java Shell 开发工具
git集成IDEA,托管项目实现版本管理
git集成IDEA,托管项目实现版本管理
54 0
|
5月前
|
jenkins Shell 持续交付
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
354 0
|
6月前
|
存储 NoSQL 数据处理
组合和继承怎么集成一个性能较好的项目
组合与继承是面向对象编程的核心概念,前者通过对象间关联实现高效解耦,后者则重用代码以节省空间和内存。组合常用于现代项目,利用代理与依赖注入简化代码管理;而继承简化了子模块对父模块资源的应用,但修改会影响整体。随着分层解耦及微服务架构如SpringCloud的出现,这些技术进一步优化了数据处理效率和服务响应性能,尤其在分布式存储与高并发场景下。同步异步调用、Redis分布式应用等也广泛运用组合与继承,实现代码和内存空间的有效复用。
|
7月前
|
Java Spring UED
Spring框架的异常处理秘籍:打造不败之身的应用!
【8月更文挑战第31天】在软件开发中,异常处理对应用的稳定性和健壮性至关重要。Spring框架提供了一套完善的异常处理机制,包括使用`@ExceptionHandler`注解和配置`@ControllerAdvice`。本文将详细介绍这两种方式,并通过示例代码展示其具体应用。`@ExceptionHandler`可用于控制器类中的方法,处理特定异常;而`@ControllerAdvice`则允许定义全局异常处理器,捕获多个控制器中的异常。
83 0

热门文章

最新文章