7

Tengo un canal de cola y un activador de servicio con un sondeo que lee desde esa cola. Me gustaría tener la configuración para decir "Quiero 50 hilos para sondear esa cola, y cada vez que sondeas y recibes un mensaje de vuelta, en este hilo, invocas el servicio al que apunta el activador del servicio".Integración de Spring: activadores de servicio simultáneos

El servicio no tiene anotaciones @Async, pero es apátrida y segura de ejecutar de forma concurrente.

¿Hará lo siguiente? ¿Hay otras formas preferidas de lograr esto?

<int:channel id="titles"> 
    <int:queue/> 
</int:channel> 

<int:service-activator output-channel="resolvedIds" ref="searchService" method="searchOnTitle" input-channel="titles"> 
    <int:poller fixed-delay="100" time-unit="MILLISECONDS" task-executor="taskExecutor"></int:poller> 
</int:service-activator> 

<task:executor id="taskExecutor" pool-size="50" keep-alive="120" /> 

Respuesta

8

Sí, creo que hace lo que usted quiere. Una vez que introduce un QueueChannel, la interacción se vuelve asíncrona; no necesita @Async. Si no configura explícitamente un sondeo, usará el sondeador predeterminado.

Lo que ha descrito es la mejor manera de lograrlo. También podría considerar poner un límite en el tamaño de la cola, de modo que en caso de que exista un retraso en el cumplimiento con el productor, no se produzca un problema de falta de memoria. Si se especifica un tamaño, las llamadas de envío en el canal se bloquearán, actuando como un acelerador.

La configuración que tiene funcionará como espera. El único problema es que una vez que comienzas a crear ejecutores y sondeadores para cada punto final, resulta difícil determinar la configuración óptima para toda la aplicación. Está bien hacer este tipo de optimización para unos pocos pasos específicos, pero no para todos los puntos finales (nada en sus preguntas sugiere que lo esté haciendo, solo pensé que lo plantearía de todos modos.

Cuestiones relacionadas