1:建表
package com.whty.common.util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.StringUtils;
import com.whty.common.annotation.Verif;
public class InterfaceClient {
public static String url = UrlUtil.URL;
public static String appKey = UrlUtil.APPKEY;
public static String appSecret = UrlUtil.APPSECRET;
public static String messageFormat = UrlUtil.MESSAGEFORMAT;
public static String v = UrlUtil.INTERFACE_V;
public static String timeoutStr = UrlUtil.TIMEOUT;
private static Object obj;
private static String method;
public static String result = "";
/**
* 调用接口
* @param obj 请求对象参数
* @param method 请求的接口名
* @return
*/
public static String interfaceClient(Object object,String methodName){
setMethod(methodName);
setObj(object);
int timeout = getTimeOut(methodName);
Runnable rb=new Runnable() {
@Override
public void run() {
InterfaceClient ic=new InterfaceClient();
ic.dosth();//调用外部接口
}
};
try {
long s=Calendar.getInstance().getTimeInMillis();
callSth(rb,TimeUnit.MILLISECONDS,timeout);
System.out.println(">>>>>调用外部接口("+methodName+")运行时间:"+(Calendar.getInstance().getTimeInMillis()-s)+"毫秒,入参:"+JsonUtils.toJson(object));
} catch (Exception e) {
result = "";
System.err.println(">>>>>超时设置为:"+timeout+",你调用外部接口("+methodName+")超时了!,入参:"+JsonUtils.toJson(object));
}
return result;
}
/**
*
* @Description:调用接口
* @param obj 请求对象参数
* @param method 请求的接口名
* @param sessionId sessionId
* @return
* String
*/
public static String interfaceClient(Object obj,String method,String sessionId){
try {
String result = HTTPUtil.doPost(url, bingParam(obj,method,sessionId), "utf-8");
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String initparam(Map<String, String> form,String appSecret){
String [] keyAndValue = null;
String [] temp = null;
//参与签名参数
String sign="";
if(StringUtils.isNotEmpty(sign)){
sign = sign.substring(0,sign.length()-4);
keyAndValue = sign.split("val_");
for(int i=0;i<keyAndValue.length;i++){
temp = keyAndValue[i].split("key_");
form.put(temp[0], temp[1]);
}
}
String signStr = Sign.sign(form, appSecret);
form.put("sign", signStr);
return signStr;
}
/**
* 封装参数
* @param obj
* @param method
* @return
*/
public static TreeMap<String, String> bingParam(Object obj,String method,String sessionId){
TreeMap<String, String> para = new TreeMap<String, String>();//不需要签名
Map<String, String> sign = new HashMap<String, String>();//需要签名
if(obj != null){
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
if(field.isAnnotationPresent(Verif.class)){
String result = getFieldValueByName(field.getName(), obj).toString();
if(StringUtils.isNotBlank(result)){
Verif value = field.getAnnotation(Verif.class);
if(value.sign()){
sign.put(field.getName(), result);
}else{
para.put(field.getName(), result);
}
}
}
}
}
sign.put("appKey", appKey);
sign.put("messageFormat", messageFormat);
sign.put("method", method);
sign.put("v", v);
//登录接口权限验证
if(StringUtils.isNotBlank(sessionId)){
sign.put("sessionId", sessionId);
}
sign.put("sign", InterfaceClient.initparam(sign,appSecret));
para.putAll(sign);
return para;
}
/**
* 获取实体中属性的值
* @param fieldName
* @param o
* @return
*/
public static Object getFieldValueByName(String fieldName, Object o) {
try {
String getter = "";
//判断第二个字母是不是小写
if (Character.isLowerCase(fieldName.toString().charAt(1))) {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
getter = "get" + firstLetter + fieldName.substring(1);
} else {
getter = "get" + fieldName;
}
Method method = o.getClass().getMethod(getter, new Class[] {});
Object value = method.invoke(o, new Object[] {});
if(null == value) value="";
return value;
} catch (Exception e) {
return "";
}
}
public static void setObj(Object obj) {
InterfaceClient.obj = obj;
}
public static void setMethod(String method) {
InterfaceClient.method = method;
}
/**
* 特殊接口超时配置
* @param method
* @return
*/
public static int getTimeOut(String method){
int timeout = 10;
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("t.report.examReport", 30);//查询报告接口
map.put("t.report.markExam", 300);//查询报告接口
map.put("t.report.queryExamBindStudent", 150);//查询报告接口
map.put("t.report.examQuestionScoreInfo", 30);//查询报告接口
map.put("aam.setUserInfo", 30);//修改学生信息(教育云平台)
map.put("t.report.saveExamScoreReport", 300);//生成报告接口
map.put("t.ep.saveUpdatePaper", 40);//存储答题卡信息
map.put("t.report.createExamAnswerSheet", 40);//存储答题卡坐标信息
map.put("t.placementtest.createByClass", 40);//按班级布置测验
map.put("t.placementFile.uploader", 60);//布置测验-自定义导入
map.put("aam.classQueryForClassPublish", 40);//布置测验-初始化
map.put("ylPrint.newBindUserBatchV1", 900);//批量绑卡接口
if(map.containsKey(method) ){
timeout = map.get(method);
}else{
if(null != timeoutStr && !"null".equals(timeoutStr) && !"".equals(timeoutStr) )
timeout = Integer.parseInt(timeoutStr);
}
return timeout*1000;
}
private static ExecutorService executor=Executors.newCachedThreadPool(new ThreadFactory() {
int ncount=0;
@Override
public Thread newThread(Runnable r) {
ncount++;
Thread invokeThread=new Thread(r);
invokeThread.setName("Invoker-thread-"+ncount);
invokeThread.setDaemon(true);
return invokeThread;
}
});
public static void callSth(Runnable task,TimeUnit unit,long timeout)throws Exception{
Future<?> futureResult=executor.submit(task);
futureResult.get(timeout, unit);
}
//调用外部接口
public void dosth(){
try {
result = HTTPUtil.doPost(url, bingParam(obj,method,null), "utf-8");
} catch (Exception e) {
e.printStackTrace();
}
}
}