Как я могу получать уведомления в режиме реального времени, когда Solr готов принять другой запрос на импорт?

Я пишу простую очередь, которая отправляет запросы на обновление в ядро ​​Solr DataImportHandler. Этот обработчик обновляет ядро ​​Solr, выполняя запрос к базе данных. Когда одно обновление завершено, я хотел бы немедленно отправить следующий запрос на обновление. Однако у меня возникли проблемы с определением, когда Solr готов принять другой запрос на обновление. Вот что я пробовал:

  • Событие onImportEnd. Использование события onImportEnd казалось наиболее очевидным способом. Я создал собственный прослушиватель событий, который отправляет сетевой запрос моему приложению, чтобы указать, что Solr готов принять другой запрос. К сожалению, кажется, что это событие вызывается после импорта Solr, но до его статус idle. Если мое приложение делает второй запрос сразу после события onImportEnd, запрос возвращается со статусом «занят».

  • Событие postCommit. Я создал событие .exe, которое запускается при событии postCommit. Похоже, что этот исполняемый файл запускается во время процесса импорта — Solr не возвращается в состояние ожидания, пока этот исполняемый файл не будет завершен.

  • Событие postOptimize: это событие никогда не вызывается.

  • Опрос изменений статуса: этот метод будет работать, но будет означать задержку между каждым запросом на обновление. Я бы хотел, чтобы эти запросы выполнялись как можно быстрее.

Есть ли другой способ определить, когда Solr готов принять другой запрос на обновление?


person Nathan Friend    schedule 15.03.2018    source источник


Ответы (1)


Что я сделал в подобных сценариях:

  1. добавьте больше обработчиков DIH, у вас может быть столько, сколько вы хотите, каждый из которых указывает на свой собственный файл конфигурации xml, если это необходимо. Добавьте 10 из них, например
  2. каждый раз, когда у вас есть часть данных, для которой требуется обработчик DIH, перебирайте их все, если вы не найдете один свободный (добавьте немного sleep() для здравомыслия, если все заняты). Это хорошо сработало для индексации больших объемов.

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

Кстати, postOptimize будет вызываться при вызове optimize, а не фиксации.

person Persimmonium    schedule 15.03.2018