使用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" );