在多pod环境中只运行一次Spring Boot启动方法,可以通过使用分布式锁来实现。以下是一种可能的解决方案:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class StartupRunner implements CommandLineRunner {
private static final String LOCK_KEY = "spring-boot-startup-lock";
private static final long LOCK_EXPIRE_TIME = 60000; // 锁的过期时间,单位为毫秒
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Override
public void run(String... args) throws Exception {
// 尝试获取锁
boolean lockAcquired = false;
try {
lockAcquired = acquireLock();
if (lockAcquired) {
// 执行Spring Boot启动方法
// TODO: 在这里写下你的启动方法代码
}
} finally {
if (lockAcquired) {
releaseLock();
}
}
}
private boolean acquireLock() {
Boolean result = redisTemplate.opsForValue().setIfAbsent(LOCK_KEY, "locked", LOCK_EXPIRE_TIME, TimeUnit.MILLISECONDS);
return result != null && result;
}
private void releaseLock() {
redisTemplate.delete(LOCK_KEY);
}
}
这种方式可以确保在多个pod环境中只有一个实例能够获取锁并执行Spring Boot启动方法,从而避免重复执行。
领取专属 10元无门槛券
手把手带您无忧上云