用法
我在Atlassian JIRA 6.4.1的插件中使用Lucene IndexWriter来创建我自己的索引。 IndexWriter用于由JIRA框架创建的组件(JIRA使用spring框架)。
该组件由从索引写入和读取的不同线程使用。 IndexWriter是在首次使用时创建的,所有其他线程始终使用IndexWriter的相同实例。
只有在卸载插件或JIRA关闭后才会关闭IndexWriter(在我刚刚调用commit之后,写入成功之后)并且存在问题。
问题
该组件实现了org.springframework.beans.factory.DisposableBean接口。在方法destroy(在卸载或关闭时调用)我想关闭我的IndexWriter,但关闭IndexWriter的线程与创建IndexWriter的线程不同。所以会发生什么,我得到以下异常:
java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:151)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1261)
at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:457)
at com.atlassian.jira.util.LuceneDirectoryUtilsImpl$UtilConcurrentLock.release(LuceneDirectoryUtilsImpl.java:183)
at org.apache.lucene.index.IndexWriter.closeInternal(IndexWriter.java:1884)
at org.apache.lucene.index.IndexWriter.close(IndexWriter.java:1814)
at org.apache.lucene.index.IndexWriter.close(IndexWriter.java:1778)
发生此异常,因为在IndexWriter的Constructer中获得的写锁定被绑定到另一个线程,作为尝试关闭IndexWriter的线程。
据我所知,我无法控制哪个线程生成我的组件,哪个线程会破坏我的组件,因为这是由JIRA和spring框架处理的。
我现在的问题是,如何在不遇到此异常的情况下正确关闭我的IndexWriter?
版本:lucene-core-3.3.0-atlassian-1.jar(所以它看起来像是atlassian修改版)