1. 程式人生 > >(三)Solrj4到Solrj5的升級之路

(三)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));