WeightedResponseTimeRule这个策略每30秒计算一次服务器响应时间,以响应时间作为权重,响应时间越短的服务器被选中的概率越大。
public void setLoadBalancer(ILoadBalancer lb) {
super.setLoadBalancer(lb);
if(lb instanceof BaseLoadBalancer) {
this.name = ((BaseLoadBalancer)lb).getName();
}
this.initialize(lb);
}
构造方法无非调用setLoadBalancer,这里进行了loadBalancer的初始化。
void initialize(ILoadBalancer lb) {
if(this.serverWeightTimer != null) {
this.serverWeightTimer.cancel();
}
this.serverWeightTimer = new Timer("NFLoadBalancer-serverWeightTimer-" + this.name, true);
this.serverWeightTimer.schedule(new WeightedResponseTimeRule.DynamicServerWeightTask(), 0L,
(long)this.serverWeightTaskTimerInterval);
WeightedResponseTimeRule.ServerWeight sw = new WeightedResponseTimeRule.ServerWeight();
sw.maintainWeights();
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
WeightedResponseTimeRule.logger.info("Stopping NFLoadBalancer-serverWeightTimer-"
+ WeightedResponseTimeRule.this.name);
WeightedResponseTimeRule.this.serverWeightTimer.cancel();
}
}));
}
这个方法很有意思,起了一个循环定时任务,默认时间是30s,调度的任务是DynamicServerWeightTask,它的run方法无非调用了serverWeight.maintainWeights(),也就是说循环构造一个Task来执行这个方法。maintainWeights无非计算出每个服务器的响应时间的权重,好给choose()提供选择服务器的依据。
class DynamicServerWeightTask extends TimerTask {
DynamicServerWeightTask() {
}
public void run() {