J'ai une application Java qui s'exécute sur Jetty 9.2. Les deux utilisent la même version de Jetty. L'indexeur s'exécute la première fois que l'application démarre après le déploiement. Je n'ai pas eu de problèmes sur ma boîte de dev Windows 10 dans Netbeans. Cela ne fonctionne pas quand je le mets sur une machine Linux, que j'ai seulement l'accès SSH et les droits limités. Code java, classe Personne exécute en premier, classe Organisation exécute deuxième. à la fois dans la même session de mise en veille prolongéeLucene indexer fonctionne sous Windows, échoue sous Linux
public static void reindexViaMassIndexer(Class<?> type, SessionFactory factory) {
Session session = factory.getCurrentSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
MassIndexerProgressMonitor monitor = new SimpleIndexingProgressMonitor();
try {
fullTextSession
.createIndexer(type)
.typesToIndexInParallel(1)
.batchSizeToLoadObjects(BATCH_SIZE)
.cacheMode(CacheMode.NORMAL)
.threadsToLoadObjects(10)
.idFetchSize(BATCH_SIZE)
.progressMonitor(monitor)
.startAndWait();
} catch (InterruptedException ex) {
Logger.getLogger(HibernateLuceneIndexer.class.getName()).log(Level.SEVERE, null, ex);
}
}
Pom fichier
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-orm</artifactId>
<version>5.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>4.3.9.Final</version>
</dependency>
sortie d'erreur
17:48:00,188 ERROR LogErrorHandler:67 - HSEARCH000058: Exception occurred org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: [email protected]/tmp/cyberdex_files/org.vtarc.CyberConnections.backend.entity.Organization/write.lock: java.nio.channels.OverlappingFileLockException
Primary Failure:
Entity org.vtarc.CyberConnections.backend.entity.Organization Id null Work Type org.hibernate.search.backend.PurgeAllLuceneWork
org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: [email protected]/tmp/cyberdex_files/org.vtarc.CyberConnections.backend.entity.Organization/write.lock: java.nio.channels.OverlappingFileLockException
at org.apache.lucene.store.Lock.obtain(Lock.java:89)
at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:755)
at org.hibernate.search.backend.impl.lucene.IndexWriterHolder.createNewIndexWriter(IndexWriterHolder.java:131)
at org.hibernate.search.backend.impl.lucene.IndexWriterHolder.getIndexWriter(IndexWriterHolder.java:97)
at org.hibernate.search.backend.impl.lucene.AbstractWorkspaceImpl.getIndexWriter(AbstractWorkspaceImpl.java:112)
at org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.applyUpdates(LuceneBackendQueueTask.java:81)
at org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.run(LuceneBackendQueueTask.java:47)
at org.hibernate.search.backend.impl.lucene.SyncWorkProcessor$Consumer.applyChangesets(SyncWorkProcessor.java:145)
at org.hibernate.search.backend.impl.lucene.SyncWorkProcessor$Consumer.run(SyncWorkProcessor.java:135)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.nio.channels.OverlappingFileLockException
at sun.nio.ch.SharedFileLockTable.checkList(FileLockTable.java:255)
at sun.nio.ch.SharedFileLockTable.add(FileLockTable.java:152)
at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1108)
at java.nio.channels.FileChannel.tryLock(FileChannel.java:1155)
at org.apache.lucene.store.NativeFSLock.obtain(NativeFSLockFactory.java:169)
at org.apache.lucene.store.Lock.obtain(Lock.java:96)
... 9 more
index personne avec succès, l'organisation a échoué. Notez que le répertoire parent est également jetty: jetty (utilisateur: groupe).
[[email protected] org.vtarc.CyberConnections.backend.entity.Person]$ ls -l
-rw-r-----. 1 jetty jetty 1844 Oct 20 18:43 _9.fdt
-rw-r-----. 1 jetty jetty 67 Oct 20 18:43 _9.fdx
-rw-r-----. 1 jetty jetty 1310 Oct 20 18:43 _9.fnm
-rw-r-----. 1 jetty jetty 3687 Oct 20 18:43 _9_Lucene41_0.doc
-rw-r-----. 1 jetty jetty 4310 Oct 20 18:43 _9_Lucene41_0.pos
-rw-r-----. 1 jetty jetty 20500 Oct 20 18:43 _9_Lucene41_0.tim
-rw-r-----. 1 jetty jetty 576 Oct 20 18:43 _9_Lucene41_0.tip
-rw-r-----. 1 jetty jetty 1530 Oct 20 18:43 _9.nvd
-rw-r-----. 1 jetty jetty 171 Oct 20 18:43 _9.nvm
-rw-r-----. 1 jetty jetty 386 Oct 20 18:43 _9.si
-rw-r-----. 1 jetty jetty 102 Oct 20 18:43 segments_a
-rw-r-----. 1 jetty jetty 36 Oct 20 18:43 segments.gen
-rw-r-----. 1 jetty jetty 0 Oct 20 14:31 write.lock
[[email protected] org.vtarc.CyberConnections.backend.entity.Person]$ cd ../org.vtarc.CyberConnections.backend.entity.Organization/
[[email protected] org.vtarc.CyberConnections.backend.entity.Organization]$ ls -l
-rw-r-----. 1 jetty jetty 53 Oct 20 15:40 segments_5
-rw-r-----. 1 jetty jetty 36 Oct 20 15:40 segments.gen
-rw-r-----. 1 jetty jetty 0 Oct 20 14:31 write.lock
besoin d'autre chose?
bien que je fasse tourner une session Hibernate à 2 endroits, le premier arrive au servlet initialisé et il est fermé après la fin de l'indexeur. La deuxième session ne démarre pas avant l'initialisation de l'interface utilisateur principale. celui-ci reste dans la portée. – AFowler
Il semble que ce soit l'option numéro 2 ou une condition de concurrence. J'ai changé la journalisation de l'information à déboguer et tout a fonctionné. Par conséquent, plus de journaux entraînent un ralentissement de l'application, ce qui permet à tout le processus de se dérouler correctement. en attendant un autre test pour voir si cette théorie est correcte. – AFowler
@AFowler Notez que je parlais de Session * Factory * et non de Session. L'utilisation de plusieurs sessions en parallèle devrait fonctionner correctement, mais plusieurs SessionFactories utilisant les mêmes index ne le seront pas. Je dis "* devrait * fonctionner correctement", car comme je l'ai déjà mentionné, il s'agit d'une ancienne version de Hibernate Search et pourrait être boguée. –