Wiem, że to niesprawiedliwe z facetami z terakoty, ale czy ktoś próbował użyć Hazelcast, aby użyć zaplanowanych zadań w środowisku klastrowym?Planowane prace Hazelcast (wsparcie kwarcu?)
Najprostsza implementacja mogę obraz jest następujące architektury:
- Globalna blokada Hazelcast za zapewnienie tylko jeden serwer ma uruchomieniem config kwarcu.
- Uruchamianie rzeczywistych zadań jako DistributedTask. (można to zrobić później, w momencie, gdy ciężkie zaplanowane zadania będą wymagały obsługi wyzwalacza DistributedTask)
- Gdy tylko serwer z blokadą nie działa, inny serwer otrzymuje blokadę.
Wierzę, że byłoby to wielką zaletą dla ludzi, którzy już mają Hazelcast, ponieważ nie będą wymagać całego środowiska dev-environment, otwierając terakotę przez cały czas.
Na razie zakodowałem najprostsze rozwiązanie polegające na tym, że tylko jeden węzeł odpowiada za uruchamianie kwarcowych wyzwalaczy. Ponieważ używam tylko wywołań podobnych do Cron, może to być dopuszczalne rozwiązanie, jeśli zadbam o tworzenie rozgłaszanych zadań dla ciężkich zadań wyzwalaczy.
Oto mój org.springframework.scheduling.quartz.SchedulerFactoryBean rozszerzenie, które sprawia, że tak się stało:
@Override
public void start() throws SchedulingException {
new Thread(new Runnable() {
@Override
public void run() {
final Lock lock = getLock();
lock.lock();
log.warn("This node is the master Quartz");
SchedulerFactoryBean.super.start();
}
}).start();
log.info("Starting..");
}
@Override
public void destroy() throws SchedulerException {
super.destroy();
getLock().unlock();
}
Proszę dać mi znać, jeśli brakuje mi czegoś wielkiego i jeśli można to zrobić.
Dodałem dwa pliki do github. Oto rozszerzenie RAMJobStore:
A oto rozszerzenie Wiosna SchedulerFactoryBean:
FYI, istnieje żądanie dotyczące funkcji, aby umieścić rozproszone zaplanowane egzekucje w Hazelcast: https://github.com/hazelcast/hazelcast/issues/115 – ccleve