Solr使用SolrJ出現Lock obtain timed out: NativeFSLock

    使用SolrJ創建索引時,HttpSolrServer可用,EmbeddedSolrServer報錯:Error opening new searcher,Caused by: Lock obtain timed out: NativeFSLock。java

    出現以上問題的緣由是沒法獲取鎖。查閱了不少資料都說在solrconfig文件中加上<unlockOnStartup> true </unlockOnStartup>,可是沒有用。最後發現是程序啓動的時候SolrDispatchFilter初始化了CoreContainer(項目沿用了solr自帶的管理界面),致使EmbeddedSolrServer不能load CoreContainer。web

    解決方法:eclipse

一、修改web.xml文件中過濾器SolrRequestFilter的class爲org.common.servlet.SolrDispatchFilter。(這個類須要本身建立)spa

二、在solr官網上下載solr源代碼,找到org.common.servlet.SolrDispatchFilter。複製java文件代碼。code

三、在org.common.servlet包下建立org.common.servlet.SolrDispatchFilter類,將複製的代碼拷貝進來(注意修改package)。xml

四、同上複製BaseSolrFilter類至org.common.servlet包下。索引

五、org.common.servlet.SolrDispatchFilter中幾個語句會報錯,是由於那幾個類不在當前包下,安裝eclipse的提示直接導入這些包就好了。ip

六、爲org.common.servlet.SolrDispatchFilte類添加靜態域和靜態方法。靜態域爲:get

public static CoreContainer indexCoreContainer;

靜態方法爲:servlet

  public static CoreContainer getIndexCores() {

 return indexCoreContainer;

  }

並在已有createCoreContainer()方法中爲靜態域賦值:

  protected CoreContainer createCoreContainer() {

    SolrResourceLoader loader = new SolrResourceLoader(SolrResourceLoader.locateSolrHome());

    ConfigSolr config = loadConfigSolr(loader);

    CoreContainer cores = new CoreContainer(loader, config);

    cores.load();

    indexCoreContainer=cores;

    return cores;

  }

七、調用,完成。

     CoreContainer container = SolrDispatchFilter.getIndexCores();

     EmbeddedSolrServer solr = new EmbeddedSolrServer( container, "fulltext" );
相關文章
相關標籤/搜索