Я использовал hibernate-search, где я пометил домены @Indexed
, @Field
и многими другими.Мой проект основан на нескольких микросервисах, таких как
- Search Service - которые при запуске читают данные из БД и создают индексы.(код был упомянут ниже):
@Transactional(readOnly = true)
public void initializeHibernateSearch() {
try {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(centityManager);
fullTextEntityManager.createIndexer().startAndWait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
MicroService 1 - обновляет индекс при вставке или обновлении любого домена.
Проблема, с которой я сталкиваюсь, заключается в том, что при запуске Search Service
и создании индексов он берет блокировкииндексные файлы и никогда не снимает блокировки.и когда Microservice 1 пытается обновить индекс при вставке или обновлении, он выдает исключение, как показано ниже
org.apache.lucene.store.LockObtainFailedException: блокировка, удерживаемая другой программой: / root / data /index / default / Event / write.lock at org.apache.lucene.store.NativeFSLockFactory.obtainFSLock (NativeFSLockFactory.java:118) в org.apache.lucene.store.FSLockFactory.obtainLock (FSLockFactory.java:41) в орг.apache.lucene.store.BaseDirectory.obtainLock (BaseDirectory.java:45) в org.apache.lucene.index.IndexWriter. (IndexWriter.java:776) в org.hibernate.search.backend.impl.lucene.IndexWriterNewdec.index(IndexWriterHolder.java:126) в org.hibernate.search.backend.impl.lucene.IndexWriterHolder.getIndexWriter (IndexWriterHolder.java:92) в org.hibernate.search.backend.impl.lucene.AxWorksIceI (: 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.LuceneBackenduehue.search.backend.impl.lucene.SyncWorkProcessor $ Consumer.applyChangesets (SyncWorkProcessor.java:166) в org.hibernate.search.backend.impl.lucene.SyncWorkProcessor $ Consumer.run (SyncWorkProcessg) jj.Thread.run (Thread.java:748)
Не могли бы вы сообщить, как правильно использовать поиск в режиме гибернации в архитектуре микросервисов.