java线程池ExecutorService批量导入数据概要类设计使用

java线程池批量导入数据
@Component
public class WifiAndImsiImportTask {
	private final int INSERNUM = 50000;//每次添加的条数
	private  final String FILE_SEPARATOR = System.getProperty("file.separator");
	private Logger logger = LoggerFactory.getLogger(getClass());
	private String policeStationid;
	private String policeAreaid;
	private String policeProvinceid;
	ExecutorService threadPool = null;//线程池
	Map<String, Object> mapImsiLocation=null;
	@Resource
	WifiAndImsiImportService wifiAndImsiImportService;

	@Scheduled(cron = "0 0/5 * * * ?")
	public synchronized void runTask() {
		if (threadPool == null) {//初始化线程池
			threadPool = Executors.newFixedThreadPool(10);
		}
		policeStationid = SysDictUtils.getDictByCode("policeStationid", "policeStationid");
		policeAreaid = SysDictUtils.getDictByCode("policeAreaid", "policeAreaid");
		policeProvinceid = SysDictUtils.getDictByCode("provinceid", "provinceid");
		
		logger.info("============================================数据导入开始===================================================");
		importData();
		logger.info("============================================数据导入结束====================================================");
	}
	public void importData() {
		List<WifiImportEntity> wifiList = new ArrayList<WifiImportEntity>();//存放wifi数据
		List<IMSIImportEntity> imsiList = new ArrayList<IMSIImportEntity>();//存放IMSI数据
		StringBuffer wifiIds = new StringBuffer();
		StringBuffer imsiIds = new StringBuffer();
		
		List<Map<String,Object>> dataList = wifiAndImsiImportService.getWaitImportData();//待导入数据
		for (Map<String,Object> map : dataList) {
			String ID = "";
			try {
				ID = map.get("id").toString();
				String fileName = map.get("filename").toString();
				String filePath = map.get("filepath").toString();
				List<String> fileList = FileUtils.readLines(new File(filePath+FILE_SEPARATOR+fileName), "UTF-8");
				wifiAndImsiImportService.updateStatus(ID, "1");
				if (map.get("filetype")!= null && "1".equals(map.get("filetype"))) {
					wifiIds.append(ID).append(",");
					wifiImportData(wifiList, fileList, fileName,wifiIds);		
				} else {
					if(mapImsiLocation == null && "3".equals(map.get("filetype"))){
						logger.info("==================开始获取归属地============================");
						long starttime = System.currentTimeMillis();
						mapImsiLocation= wifiAndImsiImportService.getImsiLocation();
						logger.info("===耗时:"+(System.currentTimeMillis()-starttime)+"毫秒====");
					}
					imsiIds.append(ID).append(",");
					iMSIImportData(imsiList, fileList, fileName,imsiIds,map.get("filetype").toString());
				}
			} catch(Exception e) {
				logger.error("数据导入》》》"+e.toString());
				wifiAndImsiImportService.updateStatus(ID, "-1");
			}
		}
		insertSurplusData(wifiList, imsiList, wifiIds, imsiIds);//处理数量不满足的数据
	}
	/**
	 * 入库剩余文件
	 * */
	public void insertSurplusData(List<WifiImportEntity> wifiList,List<IMSIImportEntity> imsiList,StringBuffer wifiIds,StringBuffer imsiIds) {
		if (wifiList != null && wifiList.size()>0) {
			try{
				logger.info("============================================WIFI入库开始===================================================");
				Future<Boolean> hotWifi = threadPool.submit(new HotWifiImport(wifiList,wifiAndImsiImportService));
				Future<Boolean> hotWifihis = threadPool.submit(new HotWifiHisImport(wifiList,wifiAndImsiImportService));
				boolean b = hotWifi.get();
				boolean b1 = hotWifihis.get();
				wifiList.clear();
				wifiAndImsiImportService.updateStatus(wifiIds.toString(), "2");
				wifiIds.setLength(0);//清空Stringbuffer
				logger.info("============================================WIFI入库结束=================================");
			} catch(Exception e) {
				wifiList.clear();
				wifiAndImsiImportService.updateStatus(wifiIds.toString(), "-1");
				wifiIds.setLength(0);//清空Stringbuffer
				logger.error(e.toString());
			}
		}
		if (imsiList != null && imsiList.size()>0) {
			try{
				logger.info("============================================IMSI入库开始===================================================");
				Future<Boolean> imsiWifi = threadPool.submit(new HotImsiImport(imsiList, wifiAndImsiImportService));
				Future<Boolean> imsiWifihis = threadPool.submit(new HotImsiHisImport(imsiList, wifiAndImsiImportService));
				boolean b = imsiWifi.get();
				boolean b1 = imsiWifihis.get();
				imsiList.clear();
				wifiAndImsiImportService.updateStatus(imsiIds.toString(), "2");
				imsiIds.setLength(0);//清空Stringbuffer
				logger.info("============================================IMSI入库结束条数据=================================");
			} catch(Exception e) {
				imsiList.clear();
				wifiAndImsiImportService.updateStatus(imsiIds.toString(), "-1");
				imsiIds.setLength(0);//清空Stringbuffer
				logger.error(e.toString());
			}
		}
	}
}


//IMSI完整数据入库
class HotImsiHisImport implements Callable<Boolean>{
	List<IMSIImportEntity> list = null;
	WifiAndImsiImportService wifiAndImsiImportService;
	
	public HotImsiHisImport(List<IMSIImportEntity> list,WifiAndImsiImportService wifiAndImsiImportService) {
		this.list = list;
		this.wifiAndImsiImportService = wifiAndImsiImportService;
	}
	@Override
	public Boolean call() {
		try {
			int insertNum = wifiAndImsiImportService.insertIMSIData(list,"social_hot_imeilog_his");
			if (insertNum < 0) {
				return false;
			}
		}catch(Exception e) {
			return false;
		}
		return true;
	}
}

//IMSI数据入库
class HotImsiImport implements Callable<Boolean>{
	private Logger logger = LoggerFactory.getLogger(getClass());
	List<IMSIImportEntity> list = null;
	WifiAndImsiImportService wifiAndImsiImportService;
	private String hotArea;
	public HotImsiImport(List<IMSIImportEntity> list,WifiAndImsiImportService wifiAndImsiImportService) {
		this.list = list;
		this.wifiAndImsiImportService = wifiAndImsiImportService;
		hotArea = SysDictUtils.getDictByCode("hot", "hotaera");//热点区域
	}
	@Override
	public Boolean call() {
		try {
			List<IMSIImportEntity> anasisList = new ArrayList<IMSIImportEntity>();
			List<String> imsiRedList = HotRedListTask.getImsiRedList();
			for (IMSIImportEntity importEntity : list) {
				if (!(imsiRedList.contains(importEntity.getImsi()))) {
					String starttime = importEntity.getStarttime();
					starttime = starttime.replace("\"", "");
					String[] starttimes = starttime.split("\\s+");
					String time = starttimes[0];
					String hour = starttimes[1].split(":")[0];
					String location = importEntity.getLocation();
					if (location == null || "".equals(location)) {
						location = "其他";
					}
					importEntity.setGroupBySiteStatic(importEntity.getWsiteid()+"|"+importEntity.getWagentid()+"|"+time);
					importEntity.setGroupBySiteTime(importEntity.getWsiteid()+"|"+time+"|"+hour);
					importEntity.setGroupBySiteLocation(importEntity.getWsiteid()+"|"+importEntity.getWagentid()+"|"+time+"|"+location);
					importEntity.setGroupBySiteTimeIMSI(importEntity.getImsi()+"|"+importEntity.getWsiteid()+"|"+time);
					anasisList.add(importEntity);
				}
			}
			anasisData(anasisList);//数据分析
			warmResult(anasisList);//预警结果分析
			int insertNum  = wifiAndImsiImportService.insertIMSIData(anasisList,"social_hot_imeilog");//数据入库
			if (insertNum < 0) {
				return false;
			}
		}catch(Exception e) {
			return false;
		}
		return true;
	}
	//统计IMEI个数
	public int getIMEITotal(List<IMSIImportEntity> list) {
		int count = 0;
		for(IMSIImportEntity iMSIImportEntity:list) {
			try {
				if (iMSIImportEntity.getImei() != null && !"".equals(iMSIImportEntity.getImei()) && !"000000000000000".equals(iMSIImportEntity.getImei())) {
					count++;
				}
			} catch(Exception e) {
				
			}
		}
		return count;
	}
	/**
	 * 数据分析
	 * */
	 public boolean anasisData(List<IMSIImportEntity> anasisList) {
		 try{
				String policeAreaid = SysDictUtils.getDictByCode("policeAreaid", "policeAreaid");
				String policeProvinceid = SysDictUtils.getDictByCode("provinceid", "provinceid");
				
				List<Map<String,Object>> updateHotSiteStaticList = new ArrayList<>();//站点时间数量统计-修改
				List<Map<String,Object>> updateHotSiteTimeList = new ArrayList<>();//站点时间小时数量统计-修改
				List<Map<String,Object>> updateHotSiteLocationList = new ArrayList<>();//站点时间归属地数量统计-修改
				List<Map<String,Object>> updateHotSiteIMSITimeList = new ArrayList<>();//IMSI站点时间-修改
				
				List<Map<String,Object>> insertHotSiteStaticList = new ArrayList<>();//站点时间数量统计-添加
				List<Map<String,Object>> insertHotSiteTimeList = new ArrayList<>();//站点时间小时数量统计-添加
				List<Map<String,Object>> insertHotSiteLocationList = new ArrayList<>();//站点时间归属地数量统计-添加
				List<Map<String,Object>> insertHotSiteIMSITimeList = new ArrayList<>();//IMSI站点时间-添加
				
				List<Map<String,Object>> hotSiteStaticList = wifiAndImsiImportService.getSiteStatic();//已存在站点时间
				List<Map<String,Object>> hotSiteTimeList = wifiAndImsiImportService.getSiteStaticTime();//已存在站点时间小时
				List<Map<String,Object>> hotSiteLocationList = wifiAndImsiImportService.getSiteStaticLocation();//已存在站点时间归属地
				List<Map<String,Object>> hotSiteIMSITimeList = wifiAndImsiImportService.getIMSISite();//已存在IMSI站点时间
				
				Map<String, List<IMSIImportEntity>> hotSiteStaticMap = anasisList.stream().collect(Collectors.groupingBy(IMSIImportEntity::getGroupBySiteStatic));
				Map<String, List<IMSIImportEntity>> hotSiteTimeMap = anasisList.stream().collect(Collectors.groupingBy(IMSIImportEntity::getGroupBySiteTime));
				Map<String, List<IMSIImportEntity>> hotSiteLocationMap = anasisList.stream().collect(Collectors.groupingBy(IMSIImportEntity::getGroupBySiteLocation));
				Map<String, List<IMSIImportEntity>> hotSiteIMSITimeMap = anasisList.stream().collect(Collectors.groupingBy(IMSIImportEntity::getGroupBySiteTimeIMSI));
				for (String key : hotSiteStaticMap.keySet()) {
					try {
						  Map<String, Object> resultMap = new HashMap<String, Object>();
						  String[] keys = key.split("\\|");
						  resultMap.put("SITEID", keys[0]);
						  resultMap.put("AGENTID", keys[1]);
						  resultMap.put("STATICTIME", keys[2]);
						  resultMap.put("PROVINCEID", policeProvinceid);
						  resultMap.put("AREAID", policeAreaid);
						  resultMap.put("TYPE", "3");//类型:1:热点wifi,2:嗅探wifi,3:imsi
						  if (hotSiteStaticList.contains(resultMap)) {//表示数据已存在则修改总数
							  resultMap.put("TOTAL", hotSiteStaticMap.get(key).size());//不能放在if外边否则会影响判断
							  updateHotSiteStaticList.add(resultMap);
						  } else {
							  resultMap.put("TOTAL", hotSiteStaticMap.get(key).size());
							  insertHotSiteStaticList.add(resultMap);
						  }
						  
						  Map<String, Object> resultIMEIMap = new HashMap<String, Object>();
						  resultIMEIMap.put("SITEID", keys[0]);
						  resultIMEIMap.put("AGENTID", keys[1]);
						  resultIMEIMap.put("STATICTIME", keys[2]);
						  resultIMEIMap.put("PROVINCEID", policeProvinceid);
						  resultIMEIMap.put("AREAID", policeAreaid);
						  resultIMEIMap.put("TYPE", "4");//类型:1:热点wifi,2:嗅探wifi,3:imsi
						  if (hotSiteStaticList.contains(resultIMEIMap)) {//表示数据已存在则修改总数
							  resultIMEIMap.put("TOTAL", getIMEITotal(hotSiteStaticMap.get(key)));//不能放在if外边否则会影响判断
							  updateHotSiteStaticList.add(resultIMEIMap);
						  } else {
							  resultIMEIMap.put("TOTAL", getIMEITotal(hotSiteStaticMap.get(key)));
							  insertHotSiteStaticList.add(resultIMEIMap);
						  }
					} catch(Exception e) {
						e.printStackTrace();
					}
				}
				for (String key : hotSiteTimeMap.keySet()) {
					try {
						  Map<String, Object> resulTimetMap = new HashMap<String, Object>();
						  String[] keys = key.split("\\|");
						  resulTimetMap.put("SITEID", keys[0]);
						  resulTimetMap.put("STATICTIME", keys[1]);
						  resulTimetMap.put("STATICHOUR", keys[2]);
						  resulTimetMap.put("PROVINCEID", policeProvinceid);
						  resulTimetMap.put("AREAID", policeAreaid);
						  resulTimetMap.put("TYPE", "3");//类型:1:热点wifi,2:嗅探wifi,3:imsi
						  if (hotSiteTimeList.contains(resulTimetMap)) {//表示数据已存在则修改总数
							  resulTimetMap.put("TOTAL", hotSiteTimeMap.get(key).size());//不能放在if外边否则会影响判断
							  updateHotSiteTimeList.add(resulTimetMap);
						  }else {
							  resulTimetMap.put("TOTAL", hotSiteTimeMap.get(key).size());//不能放在if外边否则会影响判断
							  insertHotSiteTimeList.add(resulTimetMap);
						  }
					} catch(Exception e) {
						e.printStackTrace();
					}
				}
				//importEntity.setGroupBySiteLocation(importEntity.getWsiteid()+"|"+importEntity.getWagentid()+"|"+time+"|"+location);
				for (String key : hotSiteLocationMap.keySet()) {
					try {
						Map<String,Object> resultLocationMap = new HashMap<String,Object>();
						String[] keys = key.split("\\|");
						resultLocationMap.put("SITEID",keys[0]);
						resultLocationMap.put("AGENTID",keys[1]);
						resultLocationMap.put("STATICTIME",keys[2]);
						String location = keys[3];
						String[] locations = locationPattren(location);
						resultLocationMap.put("LOCATIONPROVINCENAME", locations[0]);
						resultLocationMap.put("LOCATIONAREANAME", locations[1]);
						//resultLocationMap.put("TOTAL", hotSiteLocationMap.get(key).size());
						resultLocationMap.put("PROVINCEID", policeProvinceid);
						resultLocationMap.put("AREAID", policeAreaid);
						  if (hotSiteLocationList.contains(resultLocationMap)) {//表示数据已存在则修改总数
							  resultLocationMap.put("TOTAL", hotSiteLocationMap.get(key).size());//不能放在if外边否则会影响判断
							  updateHotSiteLocationList.add(resultLocationMap);
						  }else {
							  resultLocationMap.put("TOTAL", hotSiteLocationMap.get(key).size());//不能放在if外边否则会影响判断
							  insertHotSiteLocationList.add(resultLocationMap);
						  }
					} catch(Exception e) {
						e.printStackTrace();
					}
				}
				if (hotArea.equals("1")) {
					logger.info("============================开始遍历IMSI异常站点数据=======================================================================");
					long starttime = System.currentTimeMillis();
					insertHotSiteIMSITimeList = compareForIMSISite(hotSiteIMSITimeList,hotSiteIMSITimeMap);
					logger.info("============================耗时:"+(System.currentTimeMillis()-starttime)+"毫秒==========================================");
				}
				wifiAndImsiImportService.updateSiteStatic(updateHotSiteStaticList);
				wifiAndImsiImportService.updateSiteStaticTime(updateHotSiteTimeList);
				wifiAndImsiImportService.updateSiteStaticLocation(updateHotSiteLocationList);
				wifiAndImsiImportService.updateIMSISite(updateHotSiteIMSITimeList);

				wifiAndImsiImportService.insertSiteStatic(insertHotSiteStaticList);
				wifiAndImsiImportService.insertSiteStaticTime(insertHotSiteTimeList);
				wifiAndImsiImportService.insertSiteStaticLocation(insertHotSiteLocationList);
				wifiAndImsiImportService.insertIMSISite(insertHotSiteIMSITimeList);
		 } catch(Exception e) {
			 e.printStackTrace();
			 return false;
		 }
		 return true;
	 }
	 /**
	  * 轨迹分析入库比较方法
	  * */
	 public List<Map<String,Object>> compareForIMSISite(List<Map<String,Object>> sourceList,Map<String, List<IMSIImportEntity>> hotSiteIMSITimeMap) {
		 Set<String> dataByFileSet = new HashSet<String>();//文件中获取的数据
		 Set<String> dataByDataSet = new HashSet<String>();//数据库中获取的数据
		 Set<String> tempSet = new HashSet<String>();//临时集合
		 for (String key : hotSiteIMSITimeMap.keySet()) {//Map数据转为set集合
				try {
					  String[] keys = key.split("\\|");
					  String IMSI = keys[0];
					  String SITEID = keys[1];
					  String STATICDAY = keys[2];
					  String compareValue = IMSI+"|"+SITEID+"|"+STATICDAY;
					  dataByFileSet.add(compareValue);
				} catch(Exception e) {
					logger.error(e.toString());
				}
			}
		 for (Map<String,Object> map : sourceList) {
			 String compareValue = map.get("COMPAREVALUE").toString();
			 dataByDataSet.add(compareValue);
		 }
		 tempSet.addAll(dataByFileSet);
		 tempSet.removeAll(dataByDataSet);
		 List<Map<String,Object>> list = new ArrayList<>();//IMSI站点时间-修改
		 for (String s : tempSet) {//转为list集合
			 try{
				 String[] ss = s.split("\\|");
				 Map<String,Object> params = new HashMap<String,Object>();
				 params.put("IMSI", ss[0]);
				 params.put("SITEID", ss[1]);
				 params.put("STATICDAY", ss[2]);
				 list.add(params);
			 }catch(Exception e) {
				 logger.error(e.toString());
			 }
		 }
		 return list;
	 }
	 public String[] locationPattren(String location) {
		 String[] result = new String[2];
		 if (location == null || "".equals(location)) {
			 result[0] = "其他";
			 result[1] = "其他";
		 } else if(Pattern.matches(".*-.*", location)){
			 result[0] = location.split("-")[0];
			 result[1] = location.split("-")[1];
		 } else if(Pattern.matches(".*省.*市", location)){
			 result[0] = location.split("省")[0];
			 String s = location.split("省")[1];
			 result[1] = s.substring(0, s.length()-1);
		 } else if(Pattern.matches(".*省.*", location)){
			 result[0] = location.split("省")[0];
			 result[1] = location.split("省")[1];
		 } else if(Pattern.matches(".*市.*", location)){
			 if (location.split("市").length > 1) {
				 result[0] = location.split("市")[0];
				 result[1] = location.split("市")[1]; 
			 } else {
				 result[0] = location.split("市")[0];
				 result[1] = "其他";
			 }
		 } else {
			 List<String> plist = new ArrayList<String>();
			 plist.add("内蒙古");
			 plist.add("广西");
			 plist.add("西藏");
			 plist.add("宁夏");
			 plist.add("新疆");
			 boolean isempty = true;
			 for (String p : plist) {
				 if (location.contains(p)) {
					 result[0] = p;
					 result[1] = location.substring(p.length(), location.length());
					 isempty = false;
				 }
			 }
			 if (isempty) {
				 result[0] = location;
				 result[1] = "其他";
			 }
		 }
		 return result;
	 }
	 /**
	  * 获取符合预警值得结果
	  * */
	 public void warmResult(List<IMSIImportEntity> anasisList) {
		 try {
			 List<HotWarmImportEntity> warmList = wifiAndImsiImportService.getWarmInfo("3");//3:imsi实时预警,4:wifi实时预警5:imei实时预警
			 List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>();
			 for (IMSIImportEntity imsiImportEntity : anasisList) {
				 try{
					 for (HotWarmImportEntity hotWarmEntity : warmList) {
						 if (hotWarmEntity.getWarmvalue().equals(imsiImportEntity.getImsi()) || hotWarmEntity.getWarmvalue().equals(imsiImportEntity.getImei())) {
							 Map<String,Object> map = new HashMap<String,Object>();
							 map.put("id", hotWarmEntity.getId());
							 map.put("warmTime", imsiImportEntity.getStarttime());
							 map.put("siteId", imsiImportEntity.getWsiteid());
							 resultList.add(map);
						 }
					 } 
				 } catch(Exception e) {
					 e.printStackTrace();
				 }
			 }
			 wifiAndImsiImportService.insertWarmResult(resultList); 
		 } catch(Exception e) {
			 e.printStackTrace();
		 }
	 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值