异常——org.apache.lucene.util.SetOnce$AlreadySetException

异常介绍

SetOnce

A convenient class which offers a semi-immutable object wrapper implementation which allows one to set the value of an object exactly once, and retrieve it many times.

用来封装对象的一个类,只能赋值一次,可以多次读取值,比如private SetOnce<IndexWriter> writer = new SetOnce<>();

那么writer.set(IndexWriter);只能被执行一边,哪怕是同一个IndexWriter;

AlreadySetException

If set(Object) is called more than once, SetOnce.AlreadySetException is thrown and the operation will fail.

writer.set(IndexWriter);被调用多过一次就抛这个异常。

异常出处

写了个定时更新索引的任务

TimerTask task = new Task(new Runnable() {
    public void run() {
        index();//建索引
        indexWriter = new IndexWriter(Directory,IndexWriterConfig);//初始化已关闭的indexWriter
    }
});

异常描述

Exception in thread "main" org.apache.lucene.util.SetOnce$AlreadySetException: The object cannot be set twice!
    at org.apache.lucene.util.SetOnce.set(SetOnce.java:69)
    at org.apache.lucene.index.IndexWriterConfig.setIndexWriter(IndexWriterConfig.java:148)
    at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:687)

原理分析

分析构造方法new IndexWriter(Directory,IndexWriterConfig);

1 public IndexWriter(Directory d, IndexWriterConfig conf) throws IOException {
2     conf.setIndexWriter(this); // prevent reuse by other instances
3     ……
4     ……
5     ……
6 }

重点在第二行conf.setIndexWriter(this);

 1 private SetOnce<IndexWriter> writer = new SetOnce<>();
 2
 3   /**
 4    * Sets the {@link IndexWriter} this config is attached to.
 5    *
 6    * @throws AlreadySetException
 7    *           if this config is already attached to a writer.
 8    */
 9   IndexWriterConfig setIndexWriter(IndexWriter writer) {
10     this.writer.set(writer);
11     return this;
12   }

是这样,IndexWriterConfig里的wirter变量,是用SetOnce封装的,当再用用一个IndexWriterConfig去构造IndexWriter时,writer被赋值两次所以报错了

解决办法

重新构造一个IndexWriterConfig

TimerTask task = new Task(new Runnable() {
    public void run() {
        index();//建索引
        IndexWriterConfig config = new IndexWriterConfig(Version.Lucene_36,Analyzer);
        indexWriter = new IndexWriter(Directory,IndexWriterConfig);//初始化已关闭的indexWriter
    }
});

TO BE CONTINUED……

时间: 2024-11-07 11:45:05

异常——org.apache.lucene.util.SetOnce$AlreadySetException的相关文章

【手把手教你全文检索】Apache Lucene初探

PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也不用打马赛克了,都是网络分享的开源资料,当然也不涉及任何利益关系. 如若转载,还请注明出处——xingoo 讲解之前,先来分享一些资料 首先呢,学习任何一门新的亦或是旧的开源技术,百度其中一二是最简单的办法,先了解其中的大概,思想等等.这里就贡献一个讲解很到位的ppt.已经被我转成了PDF,便于搜藏

Spring Boot常见问题(二)Unable to start embedded container; nested exception is java.lang.NoSuchMethodError: org.apache.tomcat.util.scan.StandardJarScanner.setJarScanFilter(Lorg/apache/tomcat/JarScanFilter;

问题描述:通过Spring Boot官方提供的方式,写出如下HelloWorld代码. @Controller @EnableAutoConfiguration public class HelloWorld { @RequestMapping("/wu") @ResponseBody String home() { return "Hello World!"; } public static void main(String[] args) throws Exce

全文检索:Apache Lucene框架入门实例

一 简介 Lucene属于Apache开源项目的一部分,是一个开源的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言) Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎.在Java开发环境里Lucene是一个成熟的免费开源工具.就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序

org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.apache.AnnotationProcessor

这几天来公司,公司的SVN坏掉了,然后项目还比较大,是一个分布式的,然后同事就把项目发我了.我在myeclipse里面导入项目了,把相应的jar包也建了个人的library导入了项目,现在项目不报错了,但是当我部署到tomcat启动服务器后,访问入口包了这么一个错:java.lang.ClassCastException: org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.apache.Annota

【Lucene】Apache Lucene全文检索引擎架构之中文分词和高亮显示

前面总结的都是使用Lucene的标准分词器,这是针对英文的,但是中文的话就不顶用了,因为中文的语汇与英文是不同的,所以一般我们开发的时候,有中文的话肯定要使用中文分词了,这一篇博文主要介绍一下如何使用smartcn中文分词器以及对结果的高亮显示. 1. 中文分词 使用中文分词的话,首先到添加中文分词的jar包. <!-- lucene中文分词器 --> <dependency> <groupId>org.apache.lucene</groupId> <

java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringManager.getManager(Ljava/lang/Class;)Lorg/apache/tomcat/util/res/StringManager

java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringManager.getManager(Ljava/lang/Class;)Lorg/apache/tomcat/util/res/StringManager 问题: 使用Springboot打包为war部署于Tomcat7中报错 java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringManager.get

【Lucene】Apache Lucene全文检索引擎架构之入门实战

Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供.Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻.在Java开发环境里Lucene是一个成熟的免费开源工具.就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库.--<百度百科> 这篇博文主要从两个方面出发,首先介绍一下Lucene中的全文搜索原理,其次通过程序示例来展现如何使用Lucene.关于全文搜索原理部分我上网搜索了一下,也看了好几篇文章,最后在写这篇文

使用 Apache Lucene 搜索文本

好东西 下手绝不留情 转自 http://www.ibm.com/developerworks/cn/opensource/os-apache-lucenesearch/ 简介 Lucene 是一个开源.高度可扩展的搜索引擎库,可以从 Apache Software Foundation 获取.您可以将 Lucene 用于商业和开源应用程序.Lucene 强大的 API 主要关注文本索引和搜索.它可以用于为各种应用程序构建搜索功能,比如电子邮件客户端.邮件列表.Web 搜索.数据库搜索等等.Wi

hadoop错误org.apache.hadoop.util.DiskChecker$DiskErrorException Could not find any valid local directory for

错误: org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find any valid local directory for 原因: 两种可能,hadoop.tmp.dir或者data目录存储空间不足 解决办法: 看了一下我的dfs状态,data使用率不到40%,所以推测是hadoop.tmp.dir空间不足,导致无法创建Jog临时文件.查看core-site.xml发现没有配置hadoop.tmp.dir,因此使