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

    使用SolrJ建立索引时,HttpSolrServer可用,EmbeddedSolrServer报错:Error opening new searcher,Caused by: Lock obtain timed out: NativeFSLock。

    出现以上问题的原因是无法获取锁。查阅了很多资料都说在solrconfig文件中加上<unlockOnStartup> true </unlockOnStartup>,但是没有用。最后发现是程序启动的时候SolrDispatchFilter初始化了CoreContainer(项目沿用了solr自带的管理界面),导致EmbeddedSolrServer不能load CoreContainer。

    解决方法:

1、修改web.xml文件中过滤器SolrRequestFilter的class为org.common.servlet.SolrDispatchFilter。(这个类需要自己创建)

2、在solr官网上下载solr源代码,找到org.common.servlet.SolrDispatchFilter。复制java文件代码。

3、在org.common.servlet包下创建org.common.servlet.SolrDispatchFilter类,将复制的代码拷贝进来(注意修改package)。

4、同上复制BaseSolrFilter类至org.common.servlet包下。

5、org.common.servlet.SolrDispatchFilter中几个语句会报错,是因为那几个类不在当前包下,安装eclipse的提示直接导入这些包就行了。

6、为org.common.servlet.SolrDispatchFilte类添加静态域和静态方法。静态域为:

public static CoreContainer indexCoreContainer;

静态方法为:

  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;

  }

7、调用,完成。

     CoreContainer container = SolrDispatchFilter.getIndexCores();

     EmbeddedSolrServer solr = new EmbeddedSolrServer( container, "fulltext" );


转载于:https://my.oschina.net/3iVgTIG4E/blog/424004

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值