(三)Solrj4到Solrj5的升级之路

Solr5发布了,带来了许多激动人心的新特性,但Solrj的许多接口也发生了变化,升级是痛苦的,但也是必须的,下面就赶紧来看看有哪些代码需要升级吧。

变化1:SolrServer变成了SolrClient

应该说这个变化是合理的,毕竟Solrj就是一个客户端,命名为Server本身就有问题。这样一来,所有SolrServer系列的类都需要更改为SolrClient系列的类,好在方法基本继承过来了,只需要修改一下类名就可以了。

SolrServer -> SolrClient
HttpSolrServer -> HttpSolrClient
CloudSolrServer -> CloudSolrClient

变化2:提交请求的方式变了

在Solrj4中,向服务器提交请求的方式比较简单,首先扩展SolrRequest类,将需要组合的参数都以方法的形式暴露出来,并重写process方法进行参数组合,如下所示。

class MySolrRequest extends SolrRequest {

    ......

    @Override
public SolrResponse process(SolrServer server)
throws SolrServerException, IOException {
long startTime = System.currentTimeMillis();
CoreAdminResponse res = new CoreAdminResponse();
res.setResponse( server.request( this ) );
res.setElapsedTime( System.currentTimeMillis()-startTime );
return res;
}
} SolrRequest req = new MySolrRequest();
SolrResponse res = req.process(solrServer);
if (res.getResponse().findRecursive("error", "failure") != null)
return false;
return true;

在Solrj5中,SolrRequest被极大地增强了,定义了许多新的子类出来,用户基本上不需要自定义新的Request类了,但学习成本相应的也变高了,有得必有失啊!
以在Cloud中创建Collection为例,新的Request为CollectionAdminRequest.Create类,用户只需要创建这个类的实例就可以设置所有的相关参数。提交仍然是process方法,只不过这个方法已经不需要我们重载了,直接调用就可以了,而且还扩展了返回的SolrResponse类,例如这里返回的就是CollectionAdminResponse类,代码如下。

CollectionAdminRequest.Create req = new CollectionAdminRequest.Create();
try {
req.setCollectionName(coreName);
req.setConfigName(confName); req.setReplicationFactor(factor);
req.setNumShards(shards);
req.setMaxShardsPerNode(maxShardsPerNode);
CollectionAdminResponse res = req.process(cloudSolrClient);
if (res.getResponse().findRecursive("error", "failure") != null)
return false;
return true;
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

新版的process方法比老版的多抛出一个IOException异常,需要增加对该异常的处理。

变化三:对Zookeeper的支持增强了

在Solrj4中,对Zookeeper的支持还比较简单,主要就是通过org.apache.solr.cloud.ZkController类来完成对Zookeeper中内容的管理。
到了Solrj5,对ZkController类的方法进行了分隔,新增加了不少类,而且干脆就抛弃了对ZkController类的支持,因此给代码升级带来不少麻烦。
例如对于对在Zookeeper中配置文件的管理,老版代码为

ZkController.uploadConfigDir(zkClient, new File(confDir), confName);
ZkController.downloadConfigDir(zkClient, confName, new File(confDir));

新版增加了ZkConfigManager类进行专门管理,相应的方法也由静态方法变成了动态方法,尤其是参数从File类型变成了JDK7中新引入的Path类型。

ZkConfigManager confManager = new ZkConfigManager(zkClient);
confManager.uploadConfigDir(Paths.get(confDir), confName);
confManager.downloadConfigDir(confName, Paths.get(confDir));

(三)Solrj4到Solrj5的升级之路的更多相关文章

  1. Oracle打怪升级之路二【视图、序列、游标、索引、存储过程、触发器】

    前言 在之前 <Oracle打怪升级之路一>中我们主要介绍了Oracle的基础和Oracle常用查询及函数,这篇文章作为补充,主要介绍Oracle的对象,视图.序列.同义词.索引等,以及P ...

  2. SpringCloud升级之路2020.0.x版-41. SpringCloudGateway 基本流程讲解(1)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 接下来,将进入我们升级之路的又一大模块,即网关模块.网关模块我们废弃了已经进入维护状态的 ...

  3. 从苦逼到牛逼,详解Linux运维工程师的打怪升级之路

    做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点. 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具有敏锐的嗅觉感 ...

  4. 痛吻过YY寻找到真爱的三非渣本春招之路

    写下这篇文章可能就不是大家乐于见闻的面经了,更多是深入一些面试细节. 前言 我猜拿到了BAT等一线互联网公司Offer的小伙伴或者那些老鸟看到这条标题的时候会不屑一顾,认为YY这种级别的公司是属于二线 ...

  5. 唯品会海量实时OLAP分析技术升级之路

    本文转载自公众号 DBAplus社群 , 作者:谢麟炯 谢麟炯,唯品会大数据平台高级技术架构经理,主要负责大数据自助多维分析平台,离线数据开发平台及分析引擎团队的开发和管理工作,加入唯品会以来还曾负责 ...

  6. 沧桑巨变中焕发青春活力-记极1s HC5661A 打怪升级之路

    最近发现一个新货umaxhosting年付10美元的便宜VPS.2杯喜茶的价格可以让你在国外拥有一个1024MB (1GB) DDR3 RAM.1024MB (1GB) vSwap.70GB RAID ...

  7. CODING 代码托管架构升级之路

    本文为 CODING 创始团队成员王振威在『CODING 技术小馆:上海站』的演讲实录. CODING 技术小馆,是由国内专业的一站式软件服务平台 CODING 主办的一系列技术沙龙.将邀请数位业内知 ...

  8. 秋招打怪升级之路:十面阿里,终获offer!

    本文转载自:https://gongfukangee.github.io/2019/09/06/Job/ 作者:G.Fukang 开源项目推荐: JavaGuide: Java学习+面试指南!Gith ...

  9. Spring Cloud 升级之路 - 2020.0.x - 6. 使用 Spring Cloud LoadBalancer (1)

    本项目代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们使用 Spri ...

随机推荐

  1. B11:解释器模式 Iterpreter

    给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. UML: 示例代码: abstract class Expression { abstract pub ...

  2. C语言--矩阵置换

    //takePlace里的循环写错了,j循环应该是 //for (j=i;j<3;j++) //你那个写的交换了2遍,又变回原来的了.*// #include <stdio.h> ] ...

  3. map方法,以及filter方法的使用

    map()方法,会返回一个 jQuery 封装的数组, 这个数组不能直接使用,需要使用 get() 来处理返回的对象以得到基础的数组. 例子: <!DOCTYPE html> <ht ...

  4. jQuery OCUpload ——> 一键上传插件

    OCUpload为jQuery的插件(One Click Upload),意思为一键上传,封装了对于文件上传的一些方法,只需几行代码,文件上传优雅而简洁.      对于传统的文件上传,只是通过inp ...

  5. C语言-编译

    编译的时候只是需要知道函数原型(即只需要 xxx.h 文件即可), 不需要知道函数定义, 在链接阶段可以把 xxx.c 生成的 xxx.o 链接进去, 以知道函数定义 编译时,编译器需要的是语法的正确 ...

  6. C# 匿名类型 分组 求和

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. ImageLoader使用

    最近琢磨的网上的这些开源框架,imageLoader确实很好用,基本用法不记录了,参考网上的一些代码写了个ImageLoaderManager /** * Created by Lee on 2016 ...

  8. Atitit.单向sso  单点登录的设计与实现

    Atitit.单向sso  单点登录的设计与实现 1. 单点登录sso 的三大解决方案1 2. 新方案:密码管理器方案1 3. 调用方1 4. 自动登录登录2 5. 主页跳转2 1. 单点登录sso  ...

  9. 网页webbrowser

    http://www.codeproject.com/Articles/50544/Using-the-WebBrowser-Control-in-ASP-NET/

  10. java序列化,二进制和数据流

    类的序列化需要支持Serializable接口,如果类支持序列化,可以通过ObjectOutPutStream和ObjectInputStream将对象和Stream之间进行方便的转换. 首先来 看一 ...