Hibernate Search синхронное выполнение в основном потоке - PullRequest
1 голос
/ 15 июня 2010

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

Как последовательно выполнять выполнение поиска 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 Ответ

1 голос
/ 19 февраля 2012

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

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

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

...