6

Sto utilizzando Quartz Scheduler come bean Spring in un ambiente cluster.Quartz Scheduler: attiva alcuni processi su ogni nodo del cluster e alcuni solo una volta per cluster

Ho alcuni lavori annotati con @NotConcurrent e sono in esecuzione una volta per cluster (vale a dire solo in un nodo, solo in un thread).

Ora ho bisogno di eseguire un lavoro su ogni nodo del cluster. Ho rimosso l'annotazione @NotConcurrent, ma viene eseguita solo su ogni thread su una macchina. Non viene licenziato su altri nodi.

Con cosa devo annotare il lavoro?

Esempio: Job1 NotConcurrent annotated è pianificato a mezzanotte => Si attiva solo su 1 macchina ogni mezzanotte. Job2 annotato pianificato a mezzanotte => Viene attivato su ogni computer ogni mezzanotte.

Grazie.

risposta

7

Il lavoro al quarzo AFAIK viene sempre eseguito su un singolo nodo scelto da Quartz. L'annotazione @NonConcurrent impedisce solo a Quartz di eseguire lo stesso lavoro contemporaneamente su un particolare nodo.

In altre parole, non è possibile eseguire Quartz eseguendo un lavoro su più nodi contemporaneamente. Seleziona sempre un singolo nodo su cui eseguire il lavoro.

Per realizzare ciò che viene descritto, potrebbero essere necessari più lavori (utilizzando la stessa classe di lavoro e senza trigger associati). Quindi dovrai implementare una sorta di lavoro di un orchestratore che si connetterebbe da remoto, ad es. tramite JMX o RMI, ai singoli nodi e attivare i lavori manualmente.

È possibile controllare il nostro prodotto QuartzDesk (www.quartzdesk.com) che fornisce un servizio Web che fornisce un endpoint singolo tramite il quale è possibile connettersi alle singole istanze dello scheduler Quartz e, ad esempio, attivare i processi su di essi.

+3

Grazie. La conoscenza di questa limitazione mi ha portato a utilizzare l'annotazione Spring @Scheduled con un'espressione cron per avviare quel lavoro su tutti i nodi del cluster. Questo approccio ibrido sta funzionando molto bene. – fnqlo

+0

Ciao Jan, potresti spiegare una possibile soluzione in più dettagli? Ho un problema simile, ho bisogno di eseguire un'attività su tutti i nodi Weblogic (attualmente ce ne sono 2). Mi piacerebbe essere in grado di farlo ad hoc (ad esempio da un servlet). Sto già usando il quarzo per alcuni lavori programmati, quindi mi chiedevo se fosse possibile delegare questa distribuzione di attività ad esso. Grazie – andreybavt

+0

L'idea era quella di implementare i tuoi lavori di lavoro, ma non associare alcun trigger con loro. Quindi hai una sorta di lavoro di un orchestratore che sarà associato a un trigger (s). Quando Quartz avvia il lavoro di orchestrator, il lavoro si collega semplicemente tramite il servizio web JMX, RMI o JAX-WS (se si dispone di QuartzDesk) sui nodi Quartz in cui si desidera eseguire i lavori del lavoratore. Se si desidera eseguire i lavori di lavoro su tutte le istanze Quartz, il lavoro dell'orchestrator eseguirà semplicemente l'iterazione nell'elenco delle istanze Quartz configurate e li licenzierà "manualmente" su JMX/RMI/JAX-WS. –

Problemi correlati