Hibernate Search的主线程同步执行
-
27-09-2019 - |
题
似乎休眠搜索同步执行使用其他线程比并行执行调用线程。
我如何在调用线程连续执行Hibernate Search的执行?
这个问题似乎是在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。
解决方案
很老的问题,但我还不如回答这个问题......
休眠搜索确实,为了确保到了Lucene IndexWriter
一个目录(由Lucene的需要)单线程访问。我想象使用单线程执行每个目录是处理排队问题的一种途径。
如果你想这一切在你需要调用线程运行重新实施LuceneBackendQueueProcessorFactory
并将其绑定到hibernate.search.worker.backend
在Hibernate的属性。不是微不足道的,但是做-能。
不隶属于 StackOverflow