package com.hqyg.disjob.register.job;
/**
* <pre>
*
* File: WeightedRoundRobinScheduling.java
*
* Copyright (c) 2016, globalegrow.com All Rights Reserved.
*
* Description:
* TODO
*
* Revision History
* Date, Who, What;
* 2016年6月1日 Disjob Initial.
*
* </pre>
*/
import java.util.Date;
import org.apache.curator.framework.CuratorFramework;
import com.hqyg.disjob.register.cache.ZKJobCache;
import com.hqyg.disjob.register.domain.EjobServerInfo;
import com.hqyg.disjob.register.rpc.ConcurrentHashSet;
/**
*
* <pre>
*
* File: WeightedRoundRobinScheduling.java
*
* Copyright (c) 2016, globalegrow.com All Rights Reserved.
*
* Description:
* 权重轮询调度算法(WeightedRound-RobinScheduling),根据IP和权重处理,从IP和权重列表对象的列表中选出合适的机器
*
* Revision History
*
* Date: 2016年6月3日
* Author: Disjob
*
* </pre>
*/
public class WeightedRoundRobinScheduling{
/**
*
* @param client 列表中选出来的合适的机器
* @return
*/
public static EjobServerInfo GetBestSlaveServer(CuratorFramework client){
ConcurrentHashSet<EjobServerInfo> list = ZKJobCache.ipList;
EjobServerInfo server = null;
EjobServerInfo best = null;
int total = 0;
for (EjobServerInfo tmp:list){
server = tmp;
if(server.isDown()){
continue;
}
int currentWeight = server.getCurrentWeight();
int effectiveWeight = server.getEffectiveWeight();
currentWeight += effectiveWeight;
server.setCurrentWeight(currentWeight);
server.setEffectiveWeight(effectiveWeight);
total += effectiveWeight;
server.setEffectiveWeight(effectiveWeight);
effectiveWeight = server.getEffectiveWeight();
if(effectiveWeight < server.getWeight()){
effectiveWeight++;
}
server.setEffectiveWeight(effectiveWeight);
server.setCurrentWeight(currentWeight);
if(best == null || currentWeight>best.getCurrentWeight()){
best = server;
}
}
if (best == null) {
return null;
}
int currentWeight;
currentWeight = best.getCurrentWeight();
currentWeight -= total;
best.setCurrentWeight(currentWeight);
best.setCheckedDate(new Date());
return best;
}
}