代码之家  ›  专栏  ›  技术社区  ›  Timo Westkämper

主线程中的休眠搜索同步执行

  •  1
  • Timo Westkämper  · 技术社区  · 14 年前

    似乎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 回复  |  直到 13 年前
        1
  •  1
  •   Tim Gage    13 年前

    很老的问题,但我还是回答它…

    Hibernate Search这样做是为了确保对Lucene的单线程访问 IndexWriter 目录(Lucene要求)。我认为每个目录使用单线程执行器是处理排队问题的一种方法。

    如果您希望所有这些都在调用线程中运行,则需要重新实现 LuceneBackendQueueProcessorFactory 并把它绑定到 hibernate.search.worker.backend 在休眠属性中。不是小事,而是能干。