fuente - sockets en java enviar y recibir
Uso de Quartz para programar un solo trabajo en varios servidores de aplicaciones sin estado (1)
Tengo una capa de servidores de aplicaciones idénticos detrás de un equilibrador de carga. Por razones operativas, tengo la restricción de que la configuración de la aplicación en ambos servidores de aplicaciones debe ser idéntica para que los nodos se puedan agregar y eliminar fácilmente. Todos los servidores de aplicaciones comparten la misma base de datos. Los servidores de aplicaciones no están / no estarán agrupados.
Esto ha funcionado bien hasta ahora, pero ahora me gustaría tener un trabajo programado que se ejecute en exactamente uno de los servidores de aplicaciones. Todos los servidores de aplicaciones ejecutarán Quartz y tendrán la misma programación para ejecutar trabajos. El disparador se activará en todos los servidores de aplicaciones, pero me gustaría que solo un servidor de aplicaciones ejecutara realmente el trabajo. Básicamente, todos se apresuran para comenzar y solo se inicia uno, los servidores de aplicaciones restantes simplemente ignoran el trabajo. La idea aquí es que si perdemos un servidor de aplicaciones, otro ejecutaría el trabajo en su lugar, y si agregamos nuevos servidores de aplicaciones, ellos tomarán su turno para ejecutar los trabajos.
Estaba planeando hacer esto teniendo una tabla de "bloqueo de trabajo" en la base de datos que todos los servidores de aplicaciones leerían antes de comenzar un trabajo y solo comenzar si el trabajo está "desbloqueado". El servidor de aplicaciones que realiza la actualización primero a la tabla esencialmente bloqueará otros al actualizar la tabla a un estado de ejecución / restablecerla al final del trabajo.
Antes de construir esto, agradecería algunos comentarios de aquellos con más experiencia con Quartz:
a) ¿Puedo conectar este comportamiento a Quartz para que no tenga que hacerse por trabajo? Es decir, los desarrolladores pueden agregar nuevos trabajos sin preocuparse por el bloqueo del trabajo, ya que se retira.
b) ¿Cuarzo proporciona algún mecanismo incorporado para lograr algo similar a lo anterior, así que no tengo que hacerlo yo mismo?
¡Gracias!
¿Crees que esto funcionará para ti? http://quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering
Extracto del enlace.
La agrupación en clúster actualmente solo funciona con JDBC-Jobstore (JobStoreTX o JobStoreCMT), y esencialmente funciona al hacer que cada nodo del clúster comparta la misma base de datos.
El equilibrio de carga se produce automáticamente, con cada nodo del clúster activando los trabajos tan rápido como sea posible. Cuando se produce el tiempo de activación de un disparador, el primer nodo que lo adquiere (colocando un bloqueo en él) es el nodo que lo activará.