java esl连接freeswitch(三)之多台freeswitch切换上

来源:互联网 发布:淘宝上买吉他靠谱吗 编辑:程序博客网 时间:2024/06/05 01:36

先上图再解释:








我们的业务是做落地,也是就是每台机器都落地,但是必须实时的根据当前落地的fs的通话数量去自动做判断,选择使用率最低的fs接通下一个电话,我给出的详细测试

在两台服务器下出局流量基本均衡分部在各个服务器之间 (见第一图 双机出局测试)
双机在负载满之后,启动第三台语音服务器,经过一段时间的运行,负载重新分配到了三台服务器。(见第二图三机并发出局测试)


第三分部 多台fs自动切换上部分


1.思路

  通过接口调用,先通过在线的esl(不在线的,此时可以通过esl重新发起请求使其在线)判断每台fs的当前通话数,然后比较fs的使用率,选取使用率最少的那台在转化接口的请求

2.核心类

a.fs状态类

/**
 * @author zzy
 *socket启动状态
 */
public class StatusSocket  {
private String ip;//地址ip
private String strList;//启动反馈信息
private boolean result;//是否启动成功
private int showcalls;//语音服务器容许通话个数
private int currentCalls;//当前通过个数

private final static Logger log = Logger.getLogger(StatusSocket.class);

public StatusSocket() {
}
 

/**
* @param showcalls
* 改ip语音服务器是否已经超标,如果超标需要切换
* @return
*/
public boolean canUseSocket(ESLClient eSLClient) {
boolean result = false;
if(showcalls==0){
showcalls = SystemMessage.getInteger("fs_show_calls_cout");//语音服务器承受的count
}
//当前fs通话数
currentCalls = getCurrentCalls(eSLClient);
System.out.println("showCallsCount:"+showcalls);
result = showcalls>currentCalls;;
return result;
}


//当前fs通话数
public static int getCurrentCalls(ESLClient eSLClient) {

String showCallCommands = SystemMessage.getString("fs_show_calls");//语音服务器承受
String showCallsResult = eSLClient.comandString(showCallCommands);
//输出结果获取数字 10 totals
int currentCalls = 0;
String regEx="[^0-9]";   
Pattern p = Pattern.compile(regEx);   
Matcher m = p.matcher(showCallsResult); 
try {
currentCalls = Integer.valueOf( m.replaceAll("").trim());
} catch (Exception e) {
e.printStackTrace();
currentCalls = 0;
}
log.info(" host: "+eSLClient.getHost()+"  currentCalls:"+currentCalls);
return currentCalls;
}

public String getStrList() {
return strList;
}
public void setStrList(String strList) {
this.strList = strList;
}
public boolean getResult() {
return result;
}
public void setResult(boolean result) {
this.result = result;
}


public String getIp() {
return ip;
}


public void setIp(String ip) {
this.ip = ip;
}


public int getShowcalls() {
return showcalls;
}


public void setShowcalls(int showcalls) {
this.showcalls = showcalls;
}




public int getCurrentCalls() {
return currentCalls;
}




public void setCurrentCalls(int currentCalls) {
this.currentCalls = currentCalls;
}




@Override
public String toString() {
return "StatusSocket [ip=" + ip + ", result=" + result + ", showcalls=" + showcalls + ", currentCalls="
+ currentCalls + "]";
}


 }

具体可以参考注释


b.比较类,根据fs当前使用率比较

/**
 * @author zzy
 *Comparator 当前通过个数比较二者的大小
 */
public class StatusSocketComparator implements Comparator<StatusSocket> {
 
public StatusSocketComparator() {
}
 

 
@Override
public int compare(StatusSocket o1, StatusSocket o2) {
// TODO Auto-generated method stub
double o1CurrentCalls= Double.parseDouble(o1.getCurrentCalls()+".0");
double o2CurrentCalls= Double.parseDouble(o2.getCurrentCalls()+".0");
return  Double.compare(o1CurrentCalls/o1.getShowcalls(), o2CurrentCalls/o2.getShowcalls());
}


}


该类是通过比较两台fs中选择使用率最少的那一台,此类可用在下面这个类中(以后会讲述)

//存储fs所有可用的语音服务器
TreeSet<StatusSocket> socketTrees = new TreeSet<StatusSocket>(new StatusSocketComparator());


第三部分 java esl 多台freeswitch下部分

未完待续.....



0 0
原创粉丝点击