В зависимости от вашего развертывания, решение, которое работает для нас, состоит в том, чтобы создать кластер с узлами из того же приложения, используя Hazelcast, а затем, когда задача выполняется, все узлы проверяют, являются ли они главными, и только мастер запускает task.
Вы можете прочитать вступление о Hazelcast весной здесь: https://josdem.io/techtalk/spring/spring_boot_hazelcast_es/
Мы используем Hazelcast с Consul, поэтому нам не нужно настраивать ips / ports вручную, используя это: https://github.com/bitsofinfo/hazelcast-consul-discovery-spi
Если у вас не так много (dynamici c) узлов, это относительно простое решение, которое отлично работает для нас (3 узла, скоординированные развертывания с нулевым временем простоя с консулом / фабрикой от Jenkins)
Раньше мы позволяли планированию Quartz координировать все узлы, используя общий источник данных JDB C для Quartz в качестве механизма синхронизации, но реализация ошибочна, и время от времени мы получим блокировки TABLE, которые нам придется разблокировать вручную, убивая некоторые узлы.
Cheers
Редактировать:
Так выглядит один из наших классов:
// Optionally autowired, in case we don't run in a cluster (development)
private final Optional<HazelcastInstance> hazelcast;
@Scheduled(cron = "${refresh.cron}")
public void scheduledRefresh() {
// Run if we are not in a cluster or
// we are the first member of the cluster
if (!hazelcast.isPresent() ||
hazelcast.get().getCluster().getMembers().iterator().next().localMember()) {
// Run restricted method
}