我使用了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:由org.apache.lucene.store.NativeFSLockFactory.obtainFSLock(NativeFSLockFactory.java:118)处的其他程序持有的锁:/root/data/index/default/Event/write.lock org.apache.lucene.store.FSLockFactory.obtainLock(FSLockFactory.java:41)位于org.apache.lucene.index.IndexWriter的org.apache.lucene.store.BaseDirectory.obtainLock(BaseDirectory.java:45)。(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)at org。 hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.applyUpdates(LuceneBackendQueueTask.java:81)在org.hiberna在org.hibernate的org.hibernate.search.backend.impl.lucene.SyncWorkProcessor $ Consumer.applyChangesets(SyncWorkProcessor.java:166)的te.search.backend.impl.lucene.LuceneBackendQueueTask.run(LuceneBackendQueueTask.java:46)。 java.lang.Thread.run中的search.backend.impl.lucene.SyncWorkProcessor $ Consumer.run(SyncWorkProcessor.java:152)(Thread.java:748)
能告诉我在微服务架构中使用hibernate-search的正确方法吗?
有几种选择。我的建议是第一个,因为它最符合微服务的架构精神。