2012-04-20 8 views
7

que tienen una tarea programada como tal:¿Cómo funciona realmente el tamaño del grupo con las tareas programadas de Spring?

<task:scheduler id="notification.scheduler" pool-size="15" /> 

<task:scheduled-tasks scheduler="notification.scheduler"> 
    <task:scheduled ref="notificationProcessor" method="sendNextQueueEvent" fixed-rate="500" /> 
    <task:scheduled ref="notificationProcessor" method="deleteNextCompletedEvent" fixed-rate="60000" /> 
</task:scheduled-tasks> 

creo que tengo una mala comprensión de cómo funcionan las tareas programadas con el tamaño de la piscina. A pesar de que el tamaño de grupo es 15, parece que solo se está usando un subproceso. Por ejemplo, si tengo quince eventos en la cola, creo que habría quince hilos revisando cada minuto para eliminar un evento de la cola. Obviamente, esto está mal.

¿Cómo puedo hacer que haya quince hilos llamando a este método para el intervalo de tiempo usando la abstracción del planificador de Spring?

Editar: Lo que quiero lograr es esto: cada medio segundo, quiero verificar si hay eventos en cola para enviar. Cuando se hace esto, quiero enviar un máximo de 15 (si 15 existen). ¿Cómo podría lograr esto usando las abstracciones de primavera para las cosas del hilo de Java?

Respuesta

3

de primavera task:scheduler es por defecto el inmueble de frijol envoltura para java.util.concurrent.ThreadPoolExecutor:

corePoolSize - el número de hilos para mantener en la piscina, aunque están inactivos.

Esto no garantiza que la propiedad pools-size es equivalente a tener ese número de hilos activos. Por otro lado, debe tener en cuenta que en cualquier punto dado en el tiempo solo puede haber un número máximo de hilos igual a los núcleos de procesamiento en la máquina que está utilizando; es decir, todos los otros hilos estarán esperando para cambiar al modo RUNNING y continuar la ejecución.

Además, en la documentación de Spring, menciona que si esto no es lo que necesita, también puede tomar ventaja de ConcurrentTaskExecutor.

+0

Si tengo cuatro núcleos, ¿no deberían existir al menos cuatro hilos? Solo veo uno. Si tengo cien eventos en mi cola, cuando se inicia este planificador, ¿no debería ver inmediatamente cuatro llamadas de sendNextQueueEvent, una de cada cadena? – AHungerArtist

+0

Cuatro es la cantidad máxima de _actuales hilos activos_ que puede tener; no es la configuración predeterminada inicial. Ver las llamadas también depende de diferentes elementos, como el modelo de concurrencia de la cola que utiliza para los eventos y la tasa/período con el que se ejecuta la tarea. Espero que esto ayude. – nobeh

4

Primero de todo <task:scheduler/> es un contenedor alrededor de ScheduledThreadPoolExecutor que extiende ThreadPoolExecutor. Javadoc de este último dice:

hilos incluso centrales se registran inicialmente crea y se inicia sólo cuando nuevas tareas llegan

En segundo lugar hay que entender que las tareas programadas (esta es una característica de Java, no de Primavera de) no ejecutar concurrentemente, incluso si toman más tiempo que el intervalo de repetición. Ellos simplemente esperan. Entonces, no tienes 15 eventos esperando en la cola, tienes 15 ejecuciones que están atrasadas y esperas ese único hilo. No es necesario crear otro porque la próxima ejecución debe esperar a que la anterior finalice. De nuevo, así es como funciona el marco de programación de Java.

Por supuesto, si tiene varias tareas diferentes programadas, se crearán más subprocesos.

+0

Gracias. Creo que en su mayoría entiendo la relación entre las cosas ahora.Entonces (y probablemente no sea la solución más elegante), si quisiera 15 procesos de cola de procesamiento de hilos diferentes, tendría que repetir ' '15 veces? – AHungerArtist

+0

Entonces, supongo, ¿cuál es el valor del tamaño de la agrupación? ¿Es que si hay cinco tareas pero el tamaño de la agrupación es dos, las otras tareas tendrán que esperar hasta que se realicen las dos primeras? – AHungerArtist

+0

@AHungerArtist: no, en realidad un mejor enfoque sería tener un grupo administrado por Spring con 'pool-size =" 15 "' simplemente agregando un nuevo trabajo a un 'ExecutorService' ordinario con 15 hilos. Luego procesará los eventos usando todos los hilos lo más rápido posible. Explique mejor sus requiremenets, ¿desea ejecutar algún código cada 500 ms en 15 subprocesos al mismo tiempo? O añádelo a esta pregunta o abre otra para que podamos pensar en alguna solución elegante. Recuerde publicar un enlace de seguimiento si corresponde. –

Cuestiones relacionadas