Поиск в спящем режиме: MassIndexer и отсутствующие CDI-области - PullRequest
0 голосов
/ 13 июня 2018

Я использую поиск в режиме гибернации и запускаю MassIndexer следующим образом:

FullTextEntityManager ftem = Search.getFullTextEntityManager(entityManager);
ftem.createIndexer().startAndWait();

Проблемы с отсутствующими областями видимости в потоках MassIndexer возникают в двух местах:

javax.persistence.PostLoad

@PostLoad
void onPostLoad(Object o) {
   // cdi-scope aware code
}

org.hibernate.search.bridge.FieldBridge

class MyFieldBridge implements FieldBridge {
   public void set(...) {
      // cdi-scope aware code
   }
}

Возможно ли обогащение потоков MassIndexer определенной областью действия CDI (например, через ApacheDeltaspike)

1 Ответ

0 голосов
/ 13 июня 2018

Не уверен, что я правильно понимаю, но я полагаю, что вы используете бины CDI в вашем мосте поля, и у этих бинов CDI есть область действия, которая не является ни "application", ни "singleton"?

Насколько я могускажем, нет способа настроить запуск потоков массовым индексатором или обернуть пользовательский код вокруг массовых выполнений индексатора, поэтому я не думаю, что есть очевидный способ сделать то, что вы хотите.

Еслиу вас есть точное представление о том, что будет необходимо с точки зрения API, вы можете открыть заявку на нашем экземпляре JIRA с подробным описанием.Мы также горячо приветствуем исправления, если вы чувствуете необходимость в некотором кодировании;)

Что касается неочевидных решений:

  • Hibernate Search 5.9+ предоставляет JSR-352 (Пакет дляJava-приложения) интеграция, которая позволяет запускать задания массовой индексации JSR-352.В частности, интеграция работает с JBeret, который работает внутри Weld и выполняет код массовой индексации в пользовательских областях CDI.Возможно, вы сможете настроить это так, чтобы делать то, что вы хотите.
  • В вашей реализации CDI может быть некоторая область транзакции, которая автоматически активируется при открытии транзакции Hibernate ORM.Если это так (я действительно не знаю, так ли это), вы можете автоматически активировать нужную область всякий раз, когда активируется область транзакции, а область еще не активна.Действительно выстрел в темноте, но кто знает ...

Кроме того, вы можете спросить себя, зачем вам не прикладной, не одиночный прицел на полевом мосту, учитывая полевые мостыдолжны действовать одинаково независимо от того, кто запрашивал их выполнение: вы, вероятно, не захотите, чтобы сущность индексировалась по-разному каждый раз, когда ее изменяют разные пользователи ... У вас могут быть свои причины, но лучше проверить, действительно лихорошие.

...