賈晨 王為達(dá)
2 系統(tǒng)實(shí)現(xiàn)
2.1 接口動(dòng)態(tài)加載
為方便動(dòng)態(tài)加載接口邏輯,每個(gè)接口都使用獨(dú)立類實(shí)現(xiàn),通過Java注解和反射機(jī)制實(shí)現(xiàn)動(dòng)態(tài)加載。注解定義如下,用于描述接口信息:
@Retention(RetentionPolicy.RUNTIME)
public @interface InterfaceConfig{
public String name(); // 接口名稱
public int size() default 0; // 接口最大并發(fā)數(shù)
public long timeOut() default 30*1000;} // 接口執(zhí)行超時(shí)時(shí)間
這里通過注解描述了接口名稱、最大并發(fā)數(shù)、超時(shí)時(shí)間等,然后通過Java的反射機(jī)制動(dòng)態(tài)加載接口信息。代碼片斷如下:
ConcurrentHashMap
Set
for(Class clazz : classes) {
if(clazz.isAnnotationPresent(InterfaceConfig.class)) {// 獲取接口類對(duì)應(yīng)的注解信息
Annotation annotation = clazz.getAnnotation(InterfaceConfig. class);
InterfaceConfig descr = (InterfaceConfig)annotation;
Map
int concurrentSize = descr.size();
prop.put("InterfaceConfig", descr);
prop.put("interfaceClass", clazz);
configMap.put(descr.name(), prop);}}
2.2 接口調(diào)用過程
當(dāng)用戶端請(qǐng)求到達(dá)接口代理時(shí),由代理類調(diào)用實(shí)際的接口邏輯并返回結(jié)果,代碼如下:
private JSONObject invokeProcess(Map
Class clazz = (Class) map.get("interfaceClass");
Object obj = objectMap.get(interfaceName);
if (obj == null) {
obj = clazz.newInstance();
objectMap.put(interfaceName, obj);}
// 調(diào)用接口實(shí)現(xiàn)的doProcess方法執(zhí)行接口邏輯
Method m=clazz.getMethod("doProcess",newClass[]{HttpServletRequest.class, HttpServletResponse.class});
JSONObject data = (JSONObject) m.invoke(obj, new Object[]{request, response});
return data;}
3 性能測(cè)試
在Linux下部署并測(cè)試程序,監(jiān)聽8090端口,如圖3.1所示。