在实际开发中,会遇到一种情况,就是需要把数据同步到别渠道,然而同步这个操作又很费时,为了不影响当前功能的页面响应,这个时候可以考虑类似ajax中异步操作的想法,这个时候可以利用java的线程池来实现,代码如下:
public class SyncAppInfoToOtherChannelUtil {
private static Logger logger = LoggerFactory.getLogger(SyncAppInfoToOtherChannelUtil.class);
private static ExecutorService executor = Executors.newScheduledThreadPool(20);
/**
* 同步应用数据方法
* @param appInfo 待同步应用信息
*/
public static void syncAppInfo(SeAppInfoExpand appInfo,SeAppFeeInfo seAppFeeInfo,String url){
executor.submit(new Runnable() {
@Override
public void run() {
try{
String channel = appInfo.getChannel();
if(channel.equals("1")){//WEB端
WebChannelAppInfo webChannelAppInfo= changeToWebAppInfo(appInfo,seAppFeeInfo);
Map<String,WebChannelAppInfo> map = new HashMap<String,WebChannelAppInfo>();
map.put("params", webChannelAppInfo);
String reqJson = JSONObject.toJSONString(map);//请求json串信息
logger.info("【WEB端】请求参数:"+reqJson);
String str = HttpClient.doJSONPostMethod(url, reqJson);
logger.info("【WEB端】同步应用返回信息:"+str);
}else if(channel.equals("2")){//PC桌面端
}else if(channel.equals("3")){//手机移动端
PhoneChannelAppInfo phoneAppInfo = changeToPhoneAppInfo(appInfo);
String reqJson = JSONObject.toJSONString(phoneAppInfo);//请求json串信息
logger.info("【手机移动端】请求参数:"+reqJson);
String str = HttpClient.doJSONPostMethod(url, reqJson);
logger.info("【手机移动端】同步应用返回信息:"+str);
}else if(channel.equals("4")){//电子书包端
FlatChannelAppInfo flatChannelAppInfo= changeToFlatAppInfo(appInfo);
String reqJson = JSONObject.toJSONString(flatChannelAppInfo);//请求json串信息
logger.info("【电子书包端】请求参数:"+reqJson);
String str = HttpClient.doJSONPostMethod(url, reqJson);
logger.info("【电子书包端】同步应用返回信息:"+str);
}else if(channel.equals("5")){//电子班牌端
ClassChannelAppInfo classAppInfo = changeToClassAppInfo(appInfo);
String reqJson = JSONObject.toJSONString(classAppInfo);//请求json串信息
logger.info("【电子班牌端】请求参数:"+reqJson);
String str = HttpClient.doJSONPostMethod(url, reqJson);
logger.info("【电子班牌端】同步应用返回信息:"+str);
}else if(channel.equals("6")){//工作台
//同步应用到工作台
// WorkBenchAppInfo workBenchAppInfo= changeToWorkBenchAppInfo(appInfo);
String reqJson = JSONObject.toJSONString(appInfo);//请求json串信息
logger.info("【工作台】请求参数:"+reqJson);
String str = HttpClient.doJSONPostMethod(url, reqJson);
logger.info("【工作台】同步应用返回信息:"+str);
}
}catch(Exception e){
logger.info("同步应用信息失败",e);
}finally{
}
}
});
//executor.shutdown();
}
newScheduledThreadPool的好处,可以无限的往池子中存放任务(Executors.newScheduledThreadPool(20)是用来定义并发数),超过并发数的任务处于等待中,并发任务完成在继续执行等待的任务;