我使用了hibernate-search,在其中用@Indexed
,@Field
以及更多注释了域。
我的项目基于多种微服务,例如
@Transactional(readOnly = true)
public void initializeHibernateSearch() {
try {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(centityManager);
fullTextEntityManager.createIndexer().startAndWait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我面临的问题是启动Search Service
并创建索引时,它将获取索引文件上的锁,而从不释放锁。
并且当微服务1尝试在插入或更新时更新索引时,它会引发如下异常
org.apache.lucene.store.LockObtainFailedException:另一个程序持有的锁:/root/data/index/default/Event/write.lock 在org.apache.lucene.store.NativeFSLockFactory.obtainFSLock(NativeFSLockFactory.java:118) 在org.apache.lucene.store.FSLockFactory.obtainLock(FSLockFactory.java:41) 在org.apache.lucene.store.BaseDirectory.obtainLock(BaseDirectory.java:45) 在org.apache.lucene.index.IndexWriter。(IndexWriter.java:776) 在org.hibernate.search.backend.impl.lucene.IndexWriterHolder.createNewIndexWriter(IndexWriterHolder.java:126) 在org.hibernate.search.backend.impl.lucene.IndexWriterHolder.getIndexWriter(IndexWriterHolder.java:92) 在org.hibernate.search.backend.impl.lucene.AbstractWorkspaceImpl.getIndexWriter(AbstractWorkspaceImpl.java:117) 在org.hibernate.search.backend.impl.lucene.AbstractWorkspaceImpl.getIndexWriterDelegate(AbstractWorkspaceImpl.java:203) 在org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.applyUpdates(LuceneBackendQueueTask.java:81) 在org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.run(LuceneBackendQueueTask.java:46) 在org.hibernate.search.backend.impl.lucene.SyncWorkProcessor $ Consumer.applyChangesets(SyncWorkProcessor.java:166) 在org.hibernate.search.backend.impl.lucene.SyncWorkProcessor $ Consumer.run(SyncWorkProcessor.java:152) 在java.lang.Thread.run(Thread.java:748)
请让我知道在微服务体系结构中使用休眠搜索的正确方法是什么。
答案 0 :(得分:2)
有几种选择。我的建议是第一个,因为它最适合Micro服务的体系结构精神。