メインスレッドでのHibernate検索同期実行
-
27-09-2019 - |
質問
Hibernate Search同期実行は、並列実行のために呼び出しスレッド以外のスレッドを使用しているようです。
呼び出しスレッドで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に認証情報などのコンテキスト情報を公開します。
解決
非常に古い質問ですが、私もそれに答えるかもしれません...
Hibernate検索は、ルーセンへの単一のスレッドアクセスを確保するためにそれを行います IndexWriter
ディレクトリの場合(Luceneが必要としています)。ディレクトリごとにシングルスレッドエグゼキューターを使用することは、キューイングの問題に対処する方法だと思います。
呼び出しスレッドですべてを実行したい場合は、再実装する必要があります LuceneBackendQueueProcessorFactory
にバインドします hibernate.search.worker.backend
冬眠施設で。些細なことではありませんが、やることができます。
所属していません StackOverflow