Я реализовал следующий простой пример, используя функциональность лидера выборов Kubernetes, и он работает:
1. Зависимости Maven:
Код: Выделить всё
org.springframework.boot
spring-boot-starter-parent
3.3.3
org.springframework.cloud
spring-cloud-kubernetes-fabric8-leader
Код: Выделить всё
spring:
cloud:
kubernetes:
leader:
enabled: true
autoStartup: true
Код: Выделить всё
import lombok.extern.log4j.Log4j2;
import org.springframework.context.event.EventListener;
import org.springframework.integration.leader.event.OnGrantedEvent;
import org.springframework.integration.leader.event.OnRevokedEvent;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Log4j2
@Component
public class ScheduledJob {
private boolean isLeader = false;
@EventListener(OnGrantedEvent.class)
public void onLeaderGranted(OnGrantedEvent event) {
log.info("Leadership granted to this instance.");
isLeader = true;
}
@EventListener(OnRevokedEvent.class)
public void onLeaderRevoked(OnRevokedEvent event) {
log.info("Leadership revoked from this instance.");
isLeader = false;
}
@Scheduled(fixedRate = 2000)
public void foo() {
if (isLeader) {
log.info("I am foo leader.");
} else {
log.info("Skipping foo because I'm not the leader.");
}
}
}
Задание 1:
Код: Выделить всё
@Log4j2
@Component
public class ScheduledJob1 {
private boolean isLeader = false;
@EventListener(OnGrantedEvent.class)
public void onLeaderGranted(OnGrantedEvent event) {
log.info("Leadership for ScheduledJob1 granted to this instance.");
isLeader = true;
}
@EventListener(OnRevokedEvent.class)
public void onLeaderRevoked(OnRevokedEvent event) {
log.info("Leadership for ScheduledJob1 revoked from this instance.");
isLeader = false;
}
@Scheduled(fixedRate = 2000)
public void foo1() {
if (isLeader) {
log.info("I am foo 1 leader.");
} else {
log.info("Skipping foo 1 because I'm not the leader.");
}
}
}
Код: Выделить всё
@Log4j2
@Component
public class ScheduledJob2 {
private boolean isLeader = false;
@EventListener(OnGrantedEvent.class)
public void onLeaderGranted(OnGrantedEvent event) {
log.info("Leadership for ScheduledJob2 granted to this instance");
isLeader = true;
}
@EventListener(OnRevokedEvent.class)
public void onLeaderRevoked(OnRevokedEvent event) {
log.info("Leadership for ScheduledJob2 revoked from this instance.");
isLeader = false;
}
@Scheduled(fixedRate = 2000)
public void foo2() {
if (isLeader) {
log.info("I am foo2 leader.");
} else {
log.info("Skipping foo2 because I'm not the leader.");
}
}
}
Возможно, с разными ролями, но я не понимаю, как их настроить...
Если нужны разъяснения, дайте знать, заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/790 ... nt-functio