首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Solr 定時增量索引報錯 NullPointerException 根因分析與修復方案

     編輯:Java 相關知識

錯誤現場

ERROR ... SolrDataImportProperties Error loading DataImportScheduler properties
java.lang.NullPointerException
 at sun.nio.fs.UnixPath.normalizeAndCheck(UnixPath.java:77)
 at org.apache.solr.core.SolrResourceLoader.<init>(SolrResourceLoader.java:151)
 at org.apache.solr.handler.dataimport.scheduler.SolrDataImportProperties.loadProperties(SolrDataImportProperties.java:36)
 at org.apache.solr.handler.dataimport.scheduler.BaseTimerTask.<init>(BaseTimerTask.java:39)
 at org.apache.solr.handler.dataimport.scheduler.DeltaImportHTTPPostScheduler.<init>(DeltaImportHTTPPostScheduler.java:20)
 at org.apache.solr.handler.dataimport.scheduler.ApplicationListener.contextInitialized(ApplicationListener.java:47)
...

根因定位

  1. 使用第三方 apache-solr-dataimportscheduler-1.1.jar 實現定時導入
  2. SolrDataImportProperties.loadProperties() 第 36 行:new SolrResourceLoader(null) 傳入 null 實例目錄
  3. Solr 5.5.3 中 SolrResourceLoader 構造器要求 Path instanceDir 非空,否則拋 NPE
  4. 版本不兼容:舊調度器 JAR 基於 Solr 4.x API,不適用於 5.x

修復方案:源碼重構重打包

// 修正 SolrDataImportProperties.loadProperties()
public void loadProperties(boolean force) {
    try {
        // 獲取真實 Solr Home 路徑,而非傳 null
        Path solrHome = Paths.get(System.getProperty("solr.solr.home", "solr"));
        SolrResourceLoader loader = new SolrResourceLoader(solrHome);
        String configDir = loader.getConfigDir();
        configDir = SolrResourceLoader.normalizeDir(configDir);
        // ... 後續邏輯保持不變
    } catch (Exception e) {
        log.error("Load scheduler properties failed", e);
    }
}

驗證結果

  • 重新打包部署後,Tomcat 啟動無 NPE
  • 定時全量/增量導入任務正常觸發執行
  • Solr 管理界面顯示索引更新時間戳正常推進

附件下載

修復後源碼與 JAR:solr-dataimportscheduler-1.1-source.zip

最佳實踐建議

  1. 優先使用 Solr 內建 DataImportHandler + 系統定時任務,減少第三方依賴
  2. 若必須用調度器,確保 JAR 版本與 Solr 版本嚴格匹配
  3. 生產環境部署前務必在測試環境驗證完整導入鏈路
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved