All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.alogic.remote.Attempt Maven / Gradle / Ivy
package com.alogic.remote;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;
import com.alogic.remote.backend.Backend;
import com.alogic.remote.route.Route;
import com.alogic.rpc.CallException;
import com.anysoft.loadbalance.LoadBalance;
import com.anysoft.util.Configurable;
import com.anysoft.util.JsonTools;
import com.anysoft.util.Properties;
import com.anysoft.util.Reportable;
import com.anysoft.util.XMLConfigurable;
import com.anysoft.util.XmlElementProperties;
import com.anysoft.util.XmlTools;
/**
* 尝试接口
* @author yyduan
* @since 1.6.8.12
*/
public interface Attempt extends Reportable,Configurable,XMLConfigurable{
/**
* 获取后端节点
*
* @param route 路由策略
* @param lb 负载均衡策略
* @param app 应用id
* @param key 关键字
* @param p 变量集
* @param tryTimes 已经重试的次数
* @return 可用的后端节点
*/
public Backend getBackend(Route route,LoadBalance lb,String app,String key,Properties p,long tryTimes);
/**
* 虚基类
* @author yyduan
*
*/
public abstract static class Abstract implements Attempt{
/**
* a logger of slf4j
*/
protected static final Logger LOG = LoggerFactory.getLogger(Attempt.class);
@Override
public void report(Element xml) {
if (xml != null){
XmlTools.setString(xml, "module", getClass().getName());
}
}
@Override
public void report(Map json) {
if (json != null){
JsonTools.setString(json,"module",getClass().getName());
}
}
@Override
public void configure(Element e, Properties p) {
Properties props = new XmlElementProperties(e,p);
configure(props);
}
@Override
public Backend getBackend(Route route,LoadBalance lb,String app,String key,Properties p,long tryTimes) {
if (tryTimes <= 0){
return selectBackend(route,lb,app,key,p,false);
}else{
return retry(route,lb,app,key,p,tryTimes);
}
}
protected Backend selectBackend(Route route,LoadBalance lb,String app,String key,Properties p,boolean excludeNotValid){
List backends = route.select(app, p);
if (backends == null){
throw new CallException("core.e1600","Can not find valid backends.");
}
List list = backends;
if (excludeNotValid){
list = new ArrayList();
for (Backend b:backends){
if (b.isValid()){
list.add(b);
}
}
if (list.isEmpty()){
throw new CallException("core.e1600","Can not find valid backends,Not all backends is valid");
}
}
Backend backend = lb.select(key, p, list);
if (backend == null){
throw new CallException("core.e1600","Can not find valid backends,Not all backends is valid");
}
return backend;
}
public abstract Backend retry(Route route,LoadBalance lb,String app, String key, Properties p, long tryTimes);
}
}