Pregunta

Parece que Hibernate Buscar ejecución síncrona utiliza otros hilos de la rosca pidiendo la ejecución en paralelo.

¿Cómo ejecutar las ejecuciones de hibernación de la búsqueda en serie en el subproceso de llamada?

El problema parece estar en la clase 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 );
                }
            }
        }
    }

Una ejecución síncrona en serie ocurriría en el hilo que llama y expondría información de contexto como la información de autenticación al DirectoryProvider subyacente.

¿Fue útil?

Solución

Muy vieja pregunta, pero que también podría responder a ella ...

Búsqueda de hibernación hace que para garantizar el acceso de una sola rosca a la IndexWriter Lucene para un directorio (que es requerido por Lucene). Me imagino que el uso de un ejecutor de un solo roscado por directorio era una forma de lidiar con el problema de colas.

Si lo quieres todo para ejecutar en el subproceso de llamada que necesita para volver a poner en práctica el LuceneBackendQueueProcessorFactory y enlazarlo a hibernate.search.worker.backend en las propiedades de hibernación. No es trivial, pero capaces de tareas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top