SolrJ - 访问SolrCloud时的NPE

时间:2017-05-24 21:26:07

标签: solrj solrcloud

我使用Solrj库在SolrCloud上运行以下测试代码:

public static void main(String[] args) {
    String zkHostString = "192.168.56.99:2181";
    SolrClient solr = new CloudSolrClient.Builder().withZkHost(zkHostString).build();
    List<MyBean> beans = new ArrayList<>();
    for(int i = 0; i < 10000 ; i++) {
        // creating a bunch of MyBean to be indexed
        // and temporarily storing them in a List
        // no Solr operations performed here
    }

    System.out.println("Adding...");
    try {
        solr.addBeans("myCollection", beans);
    } catch (IOException | SolrServerException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    System.out.println("Committing...");
    try {
        solr.commit("myCollection");
    } catch (SolrServerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

此代码由于以下异常而失败

Exception in thread "main" java.lang.NullPointerException
    at org.apache.solr.client.solrj.impl.CloudSolrClient.requestWithRetryOnStaleState(CloudSolrClient.java:1175)
    at org.apache.solr.client.solrj.impl.CloudSolrClient.request(CloudSolrClient.java:1057)
    at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:160)
    at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:106)
    at org.apache.solr.client.solrj.SolrClient.addBeans(SolrClient.java:357)
    at org.apache.solr.client.solrj.SolrClient.addBeans(SolrClient.java:312)
    at com.togather.solr.testing.SolrIndexingTest.main(SolrIndexingTest.java:83)

这是异常的完整堆栈跟踪。我只是升级了#34;从Solr独立安装到SolrCloud(具有外部Zookeeper单个实例,而不是嵌入式实例)。使用独立的Solr,相同的代码(只有一些细微的差别,比如主机URL)过去可以很好地工作。

NPE将我送到SolrJ图书馆,我不知道。

任何人都可以帮助我了解问题的根源以及如何克服问题?由于我的经验不足以及错误信息的简洁,我无法弄清楚从哪里开始查询。

1 个答案:

答案 0 :(得分:0)

查看您的代码,我建议首先指定默认集合。

CloudSolrClient solr = new CloudSolrClient.Builder().withZkHost(zkHostString).build();
solr.setDefaultCollection("myCollection");

关于您遇到的NPE,很可能是由于网络错误造成的。

在这些行中,您的异常由for循环引发:for (DocCollection ext : requestedCollections)

  if (wasCommError) {
    // it was a communication error. it is likely that
    // the node to which the request to be sent is down . So , expire the state
    // so that the next attempt would fetch the fresh state
    // just re-read state for all of them, if it has not been retired
    // in retryExpiryTime time
    for (DocCollection ext : requestedCollections) {
      ExpiringCachedDocCollection cacheEntry = collectionStateCache.get(ext.getName());
      if (cacheEntry == null) continue;
      cacheEntry.maybeStale = true;
    }
    if (retryCount < MAX_STALE_RETRIES) {//if it is a communication error , we must try again
      //may be, we have a stale version of the collection state
      // and we could not get any information from the server
      //it is probably not worth trying again and again because
      // the state would not have been updated
      return requestWithRetryOnStaleState(request, retryCount + 1, collection);
    }
  }