賈晨 王為達
2 系統(tǒng)實現(xiàn)
2.1 接口動態(tài)加載
為方便動態(tài)加載接口邏輯,每個接口都使用獨立類實現(xiàn),通過Java注解和反射機制實現(xiàn)動態(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í)行超時時間
這里通過注解描述了接口名稱、最大并發(fā)數(shù)、超時時間等,然后通過Java的反射機制動態(tài)加載接口信息。代碼片斷如下:
ConcurrentHashMap
Set
for(Class clazz : classes) {
if(clazz.isAnnotationPresent(InterfaceConfig.class)) {// 獲取接口類對應(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)用過程
當用戶端請求到達接口代理時,由代理類調(diào)用實際的接口邏輯并返回結(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)用接口實現(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 性能測試
在Linux下部署并測試程序,監(jiān)聽8090端口,如圖3.1所示。