taskexecutor - spring thread pool
Cuál es la diferencia entre corePoolSize y maxPoolSize en Spring ThreadPoolTaskExecutor (4)
Aquí están las reglas de Sun para la creación de subprocesos en términos simples:
- Si el número de subprocesos es menor que
corePoolSize
, cree un nuevo subproceso para ejecutar una nueva tarea. - Si el número de subprocesos es igual (o mayor) al
corePoolSize
, coloque la tarea en la cola. - Si la cola está llena y el número de subprocesos es menor que
maxPoolSize
, cree un nuevo subproceso para ejecutar tareas. - Si la cola está llena y el número de subprocesos es mayor o igual que
maxPoolSize
, rechace la tarea.
Tengo que enviar massEmails a todos los usuarios de un sitio web. Quiero usar un grupo de subprocesos para cada correo electrónico que se envía. Actualmente he establecido los valores a:
<property name="corePoolSize" value="500" />
<property name="maxPoolSize" value="1000" />
¿Cuál es la diferencia entre los dos y va a escalar? Actualmente tengo aprox. 10000 usuarios.
Debe considerar aumentar el valor de queueCapacity que considerar aumentar el valor de corePoolSize o maxPoolSize . Esas dos propiedades (* PoolSize) son el número de grupo a ejecutar, pero cada mensaje se consideraría en queueCapacity
<property name="corePoolSize" value="5" />
<property name="maxPoolSize" value="10" />
<property name="queueCapacity" value="1000" />
<property name="waitForTasksToCompleteOnShutdown" value="true"/>
Si tiene 10000 usuarios para enviar, entonces 1000 * 10 (maxPoolSize) = 10000, pero si 1000 para cada hilo es pesado, podemos considerar aumentar poolSize.
Cuando se envía una nueva tarea [...] y se están ejecutando menos subprocesos
corePoolSize
, se crea un nuevo subproceso para gestionar la solicitud, incluso si otros subprocesos de trabajo están inactivos. Si hay más decorePoolSize
pero menos demaximumPoolSize
subprocesosmaximumPoolSize
ejecución, solo se creará un nuevo subproceso si la cola está llena. Al establecercorePoolSize
ymaximumPoolSize
la misma manera, crea un grupo de subprocesos de tamaño fijo. Al establecermaximumPoolSize
en un valor esencialmente ilimitado comoInteger.MAX_VALUE
, permite que el grupo acomode un número arbitrario de tareas concurrentes.
En cuanto a su situación específica, enviar 500 correos electrónicos al mismo tiempo no tiene sentido, simplemente abrumará al servidor de correo. Si necesita enviar una gran cantidad de correos electrónicos, utilice un único hilo y envíelos por el conducto de uno en uno. El servidor de correo manejará esto mucho más elegantemente que 500 conexiones separadas.
corePoolSize
es la cantidad mínima de subprocesos utilizados por el grupo. El número puede aumentar hasta maxPoolSize
. Cuando la carga baja, el grupo se reducirá a corePoolSize
.
El envío de correos electrónicos parece ser una operación de E / S encuadernada. No creo que tener 500 hilos lo haga más rápido.