Для тех, кто придет за мной, вот что я сделал.
Цель состояла в том, чтобы мой потребитель JMS генерировал мой индекс lucene, а затем каждый из моих серверов извлекал этот новый индекс после его завершения.,Вот шаги, которые я предпринял:
- Создал crontab для создания моего нового индекса каждую ночь
- Создал crontab для вызова скрипта updateLuceneIndex.sh для обновления нового индекса на каждом сервере
! / Bin / sh
TIME = date +%s
;rsync -av tomcat@consumer1.* .com: / home / tomcat / lucene / home / tomcat / luceneэхо $ TIMEmv -f / home / tomcat / lucene / lucene / home / tomcat / lucene / $ TIME
Как вы видите выше, в качестве имени каталога используется метка времени, поэтому новый индекс будет отображаться в папке с именем
/home/tomcat/lucene/1300291879
- Код сервера захватит список каталогов в каталоге / home / tomcat / lucene.
- Сортирует их по имени нового каталога изахватывает последний (самый новый)
- Сервер, который удаляет все старые индексы, кроме последних 2 (в случае, если один поврежден)
- Я создаю новый IndexReader, указывающий на новый каталог
Я не уверен, является ли это потокобезопасным.Я представляю, что если кто-то попытается выполнить правильный поиск при переключении, он получит ошибку, но в настоящее время у меня не так много поисков, чтобы сделать это вероятным сценарием.Однако, по мере роста нашего трафика, это определенно будет местом, где все может сломаться.Если кто-нибудь знает лучший способ, пожалуйста, сообщите.
Вот этот код:
public void initialize(File newIndexDirectory) throws CorruptIndexException, IOException {
try {
File path = (newIndexDirectory == null) ? new File(indexDirectory) : newIndexDirectory;
Directory index = new SimpleFSDirectory(path);
searcher = new IndexSearcher(index);
logger.debug("Successfully initialized index at: " + path.getAbsolutePath());
currentIndexFile = path;
} catch (Exception e) {
logger.warn("Lucene index is corrupt");
}
}