2012-10-08 7 views
5

¿Admite Java cualquier objeto o mecanismo de cola para manejar el tratamiento por lotes?¿tenemos un objeto o mecanismo de cola de java para manejar el tratamiento por lotes?

ex: tenemos una cola (o cualquier objeto queue deseado), algún productor empuja el elemento en la cola uno por uno, mi objetivo es cuando tenemos 10 elementos o más de 10 artículos en esta cola, podemos desencadenar algunos controlador para tratarlo en un lote.

o no se activa automáticamente, tenemos que encontrar una manera de bucle la cola con gracia en el lado del controlador.

¿tenemos un objeto o lib típico y de alto rendimiento para manejar esto?

gracias, Emre

Respuesta

0

Eche un vistazo a la documentación de la API de interfaz de java.util.Queue, que tiene varias implementaciones.

También hay una API estándar, Java Message Service (JMS) para tratar los sistemas de colas para intercambiar mensajes entre diferentes procesos.

+1

¿Cómo soluciona esto el problema del procesamiento por lotes? No creo que lo haga –

0

Creo que CountDownLatch es lo que necesita, o posiblemente CyclicBarrier. Eso le permitiría configurar un punto de sincronización que activará a los consumidores después de que haya ocurrido una cierta cantidad de operaciones, y puede usar una cola estándar como el objeto contenedor.

+0

puede por favor proporcionar algún fragmento de código, sería bueno entender el pensamiento. –

+1

Un 'CountDownLatch' es particularmente útil cuando tiene varios hilos que producen o varios hilos que consumen (o ambos). No está claro que este sea el caso aquí. –

2

El procesamiento por lotes en cola podría lograrse con wait/notify, algo así como bloquearía la llamada de subprocesos contra el recurso hasta que esté disponible o no.

public class MyQueue implements Queue<Object>{ 
     public synchronized List<Object> peek() { 
     if(this.list.size()>=10) 
        this.list.wait(); 
     return Collections.subList(0,10); 
    } 
     @Override 
    public boolean add(Object e) { 
     this.list.add(e); 
       if(this.list.size()>=10) 
        this.list.notifyAll(); 
     return false; 
    } 
} 

no se activa de forma automática

En ese caso, puede llamar a esperar con el tiempo de espera especificado.

2

Puede usar BlockingQueue.drainTo() para obtener automáticamente lotes de tareas que se realizarán. Esto es adecuado para más de 100K tareas por segundo.

Si necesita colas de mayor rendimiento, puede usar el más complejo Disruptor o Java Chronicle que puede hacer cola en las millones de tareas por segundo, ambas soportan el auto-procesamiento por lotes.

+0

, quiere decir, tenemos que implementarlo en el lado del método, ¿verdad? agregamos un bucle para ejecutar BlockingQueue.drainTo() para obtener la lista con los elementos de la cola, y luego invocar el procesador para manejarlo. –

+0

Podrías hacer eso. Tanto los productores como los consumidores tienen métodos;) –

1

He aquí un intento rápido en el procesamiento de objetos en lotes, utilizando un subproceso de fondo para recoger y objetos de proceso empujado en una cola por otros hilos:

public abstract class Batcher<E> implements Runnable { 

    public static interface BatchProcessor<E> { 
     public void processBatch(List<E> batch); 
    } 

    private final BlockingQueue<E> queue; 
    private final BatchProcessor<E> processor; 

    private Batcher(BlockingQueue<E> queue, BatchProcessor<E> processor) { 
     this.queue = queue; 
     this.processor = processor; 
    } 

    @Override 
    public void run() { 
     try { 
      while (true) { 
       List<E> batch = new ArrayList<E>(); 
       for (int i = 0; i < 10; i++) { 
        batch.add(queue.take()); 
       } 
       processor.processBatch(batch); 
      } 
     } catch (InterruptedException e) { 
      return; 
     } 
    } 

} 

Para utilizar esto, se crea un BlockingQueue y poner objetos en crear una instancia de una implementación de BatchProcessor para procesar los lotes, luego crear una instancia de Batcher para bombear objetos de la primera a la última.

Cuestiones relacionadas