集群通常是有多个相同的实例,但对于定时任务场景,只希望有一个实例工作即可,如果这个实例挂了,其他实例可以顶替。
这个问题的方案则是集群选主,一个集群中,只有一个LEADER,由LEADER负责执行定时任务工作。当LEADER被取消时,会在剩下的实例中再选LEADER。
持有分布式锁的实例则是LEADER。
SPRING INTEGRATION JDBC 则已提供相关功能。
pom.xml
< dependency >
< groupId > org.springframework.integration </ groupId >
< artifactId > spring-integration-jdbc </ artifactId >
</ dependency >
< dependency >
< groupId > org.springframework.boot </ groupId >
< artifactId > spring-boot-starter-jdbc </ artifactId >
</ dependency >
< dependency >
< groupId > org.flywaydb </ groupId >
< artifactId > flyway-core </ artifactId >
</ dependency >
< dependency >
< groupId > org.mariadb.jdbc </ groupId >
< artifactId > mariadb-java-client </ artifactId >
</ dependency
>
LeaderElectionIntegrationConfig.java
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.jdbc.lock.Defa