开发者

Hibernate Search synchronous execution in main thread

开发者 https://www.devze.com 2023-01-03 07:27 出处:网络
It seems that Hibernate Search synchronous execution uses other threads than the calling thread for parallel execution.

It seems that Hibernate Search synchronous execution uses other threads than the calling thread for parallel execution.

How do I execute the Hibernate Search executions serially in the calling thread?

The problem seems to be in the org.hibernate.search.backend.impl.lucene.QueueProcessors class :

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 );
                }
            }
        }
    }

A serial synchronous execution would happen in the calling thread and would expose context information such as authentication information to the underlying Direct开发者_C百科oryProvider.


Very old question, but I might as well answer it...

Hibernate Search does that to ensure single-threaded access to the Lucene IndexWriter for a directory (which is required by Lucene). I imagine the use of an single-threaded executor per-directory was a way of dealing with the queueing problem.

If you want it all to run in the calling thread you need to re-implement the LuceneBackendQueueProcessorFactory and bind it to hibernate.search.worker.backend in your hibernate properties. Not trivial, but do-able.

0

精彩评论

暂无评论...
验证码 换一张
取 消