(三)Solrj4到Solrj5的升級之路
(三)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));