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