(三)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. 基于.NET的轻量级微信SDK

    一.前言 特别不喜欢麻烦的一个人,最近碰到了微信开发.下载下来了一些其他人写的微信开发“框架”,但是被恶心到了,实现的太臃肿啦. 最不喜欢的就是把微信返回的xml消息在组装成实体类,所以会比较臃肿,现 ...

  2. git 基于某个分支创建分支

    1.拷贝源代码 git clone git@git地址 cd 项目目录 2.根据已有分支创建新的分支 git checkout -b yourbranchname origin/oldbranchna ...

  3. C语言中函数调用过程(如何管理栈空间)

    ps:先做草稿,以后有时间再整理并贴图,:) 主要是利用栈底寄存器(ebp).栈顶寄存器(esp)跟eax寄存器(存储返回值)来实现. 假设P调用Q: P() { Q(1,2); } (跟实际情况可能 ...

  4. 【DB2】NICKNAME报错:SQL0206N "A0.CST_NM" 在使用它的上下文中无效。 SQLSTATE=42703

    1.环境展示: 2.操作描述 现在修改数据库A中CUST_INFO物理表的表结构,新增一个字段为desc varchar(100) ALTER TABLE CUST_INFO DROP COLUMN ...

  5. iOS开发-drawRect方法小技巧(超短)

    获取画布: CGContextRef context = UIGraphicsGetCurrentContext(); 设置颜色的三种方法: [[UIColor blueColor] setStrok ...

  6. C-C Primer Plus阅读笔记

    常用头: stdio.h string.h inttypes.h limits.h float.h 1.打印short.long.long long和unsigned #include <std ...

  7. centos mysql iptables配置

    在CentOS系统中防火墙默认是阻止3306端口的,我们要是想访问mysql数据库,我们需要这个端口,命令如下: iptables -I INPUT -p tcp --dport 3036 -j AC ...

  8. netstat命令初探

    Proto :网络传输协议,主要为tcp和udp Local Address :本地的ip:port Foreign Address:远程主机的ip:port State :连线状态,主要有监听( L ...

  9. JSONP(转)

    1 什么是Jsonp? JSONP(JSON with Padding)是数据格式JSON的一种“使用模式”,可以让网页从别的网域要数据.另一个解决这个问题的新方法是跨来源资源共享. 由于同源策略,一 ...

  10. NIO之直接缓冲区与非直接缓冲区

    直接缓冲区与非直接缓冲区的概念 一.非直接缓冲区 1)创建方式 通过 static ByteBuffer allocate(int capacity) 创建的缓冲区,在JVM中内存中创建,在每次调用基 ...