@Singleton @ApplicationScoped bean中的Lucene IndexWriters关闭了IndexWriter

时间:2017-05-12 11:35:26

标签: java indexing lucene

我需要在文档根据Java Web应用程序中的内容上传到不同的索引时对文档进行索引,其中多个用户可以同时上载多个文档

我使用Lucene 6.2.1进行索引

为此我创建了一个无状态EJB。在文档上传时将文档编入索引,称为IndexingSessionBean

但由于我无法在一个索引上打开多个IndexWriters,因此我创建了一个名为CatagoryIndexWriters的@Singleton和@ApplicationScoped bean,它应该为每个文档类别都有一个Index编写器映射,并将其传递给IndexingSessionBean。

我的代码如下所示

IndexingSessionBean.java

@Stateless
public class IndexingSessionBean {
    @EJB
    CatagoryIndexWriters catagoryIndexWriters;

    public void indexFile(String documentId, String catId, byte[] fileBytes, boolean isUpdate) {

        String content = // get contents of the fileBytes in String

        try {
            IndexWriter writer = catagoryIndexWriters.getTargetIndexWriter(catId)
            Document doc = new Document();
            Field documentIdField = new StringField("documentId", documentId, Field.Store.YES);
            doc.add(documentIdField);
            doc.add(new TextField("contents", content, Field.Store.YES));
            if (!isUpdate) {
                LOG.log(Level.INFO, "Indexing file with documentId {0}", documentId);
                writer.addDocument(doc);
            } else {
                LOG.log(Level.INFO, "Updating Index for file with documentId {0}", documentId);
                writer.updateDocument(new Term("documentId", documentId), doc);
            }
        }
        catch (IOException ex) {
            LOG.log(Level.SEVERE, "Unable to index document!", ex);
        }

    }
}

CatagoryIndexWriters

@Singleton
@ApplicationScoped
@ConcurrencyManagement(BEAN)
public class CatagoryIndexWriters {

    @EJB
    SystemConfigBean systemConfigBean;


    Map<String, IndexWriter> indexWritersMap =new HashMap<String, IndexWriter>();
    private double RAMBufferSize = 256.00;

    public IndexWriter getCatagoryIndexWriter(String catId){
        IndexWriter writer;
        writer = indexWritersMap.get(catId);
        if (writer != null){
            return writer;
        }else{
            addCatagoryIndexWriterToMap(catId);
            return indexWritersMap.get(catId);
        }

    }

    private void createCatagoryIndexPath(String catId){
        String indexPath = systemConfigBean.getSearchindexPath();
        String catIndexPathString = indexPath+systemConfigBean.SEPARATORCHAR+catId;
        Path catIndexPath = new File(catIndexPathString).toPath();

        //Check the Catagory Index Folder if there is no index folder create it.

    }

    private void addCatagoryIndexWriterToMap(String catId){
        createCatagoryIndexPath(catId);
        String indexPath = systemConfigBean.getSearchindexPath();
        String catIndexPathString = indexPath+systemConfigBean.SEPARATORCHAR+catId;
        Path catIndexPath = new File(catIndexPathString).toPath();

        try {
            Directory dir = FSDirectory.open(catIndexPath);
            Analyzer analyzer = new StandardAnalyzer();
            IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
            iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
            iwc.setRAMBufferSizeMB(this.RAMBufferSize);
            try (IndexWriter writer = new IndexWriter(dir, iwc)) {
                indexWritersMap.put(catId, writer);
            }
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

但是在添加文档时我会遇到异常..

Mai 12, 2017 12:54:59 PM org.apache.openejb.core.transaction.EjbTransactionUtil handleSystemException
SCHWERWIEGEND: EjbTransactionUtil.handleSystemException: this IndexWriter is closed
org.apache.lucene.store.AlreadyClosedException: this IndexWriter is closed
        at org.apache.lucene.index.IndexWriter.ensureOpen(IndexWriter.java:740)
        at org.apache.lucene.index.IndexWriter.ensureOpen(IndexWriter.java:754)
        at org.apache.lucene.index.IndexWriter.updateDocument(IndexWriter.java:1558)
        at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1307)
        at de.zaffar.docloaddoc.beans.IndexingSessionBean.indexFile(IndexingSessionBean.java:257)

我不知道IndexWriter bieng中的close方法叫做

1 个答案:

答案 0 :(得分:0)

您的问题似乎是行try (IndexWriter writer = new IndexWriter(dir, iwc))所以此资源将在try语句后自动关闭,即一旦您将其放入地图中。

try-with-resource有一个非常具体的用例,在try-block中使用该资源,否则它将被关闭。

IndexWriter会实施AutoCloseable,因此会被关闭。

从try-with-resource中删除它并使其成为正常语句然后再试一次。