2010-06-15 3 views
1

Кажется, что синхронное выполнение Hibernate Search использует другие потоки, чем вызывающий поток для параллельного выполнения.Hibernate Поиск синхронного исполнения в основном потоке

Как выполнить выполнение поиска Hibernate последовательно в вызывающем потоке?

Проблема, кажется, в org.hibernate.search.backend.impl.lucene.QueueProcessors классе:

private void runAllWaiting() throws InterruptedException { 
     List<Future<Object>> futures = new ArrayList<Future<Object>>(dpProcessors.size()); 
     // execute all work in parallel on each DirectoryProvider; 
     // each DP has it's own ExecutorService. 
     for (PerDPQueueProcessor process : dpProcessors.values()) { 
      ExecutorService executor = process.getOwningExecutor(); 
      //wrap each Runnable in a Future 
      FutureTask<Object> f = new FutureTask<Object>(process, null); 
      futures.add(f); 
      executor.execute(f); 
     } 
     // and then wait for all tasks to be finished: 
     for (Future<Object> f : futures) { 
      if (!f.isDone()) { 
       try { 
        f.get(); 
       } 
       catch (CancellationException ignore) { 
        // ignored, as in java.util.concurrent.AbstractExecutorService.invokeAll(Collection<Callable<T>> 
        // tasks) 
       } 
       catch (ExecutionException error) { 
        // rethrow cause to serviced thread - this could hide more exception: 
        Throwable cause = error.getCause(); 
        throw new SearchException(cause); 
       } 
      } 
     } 
    } 

Последовательное синхронное исполнение будет происходить в вызывающем потоке и подвергнет контекстную информацию, такие как информация аутентификации к основному DirectoryProvider.

ответ

1

Очень старый вопрос, но я мог бы также ответить на него ...

Hibernate Search делает, что для обеспечения однопоточный доступ к Lucene IndexWriter для каталога (который требуется по Lucene). Я полагаю, что использование однопоточного исполнителя для каждого каталога было способом решения проблемы с очередью.

Если вы хотите, чтобы все это выполнялось в вызывающем потоке, вам необходимо повторно реализовать LuceneBackendQueueProcessorFactory и привязать его к hibernate.search.worker.backend в ваших спящих свойствах. Не тривиально, но умело.