需求:实现选举功能,分布式部署应用,其中一个应用充当Leader分发任务,其他应用处理任务,当Leader机器宕机时,再选举新的Leader。
直接上代码:
//每个应用初始化时,自己生成一个唯一的uuid.
String clientId = UUID.randomUUID().toString().replace("-", "");
//定时检查是否是Leader
@Scheduled(fixedRate = 1000 * 60 * 1)
public void toDo(){
if(!checkLeader()){//如果不是leader 就不分发任务
return;
}
分发任务....
}
private boolean checkLeader(){
String v = cache.set(Constans.LEADER_KEY, clientId, "NX", "EX", timeOut);
boolean setnx = "OK".equals(v);
if(setnx){
log.info("set leader with client:" + Constans.CLIENT_ID);//如果设置成功了,那么本台机器就是Leader
return true;
} else {
String value = cache.get(Constans.LEADER_KEY);
if(Constans.CLIENT_ID.equals(value)){//如果设置不成功,那么检查Leader是否是本台机器
log.info("continue leader with client:" + Constans.CLIENT_ID);
cache.expire(Constans.LEADER_KEY, timeOut);//给Leader续命
return true;
}
}
return false;
}
@PreDestroy
public void onDestory(){
cache.del(Constans.LEADER_KEY); //应用停止时候移除Leader
log.info("remove leader with client:" + Constans.CLIENT_ID);
}
网友评论