1、设置一个静态集合:
public static HashSetpendingArray = new HashSet<>();//静态文件目录保存
2、定时刷新,添加新的元素
@Async //@Scheduled(cron = "0/10 * * * * ?") @Scheduled(cron = "0 0/2 * * * ?") public void timedTaskDataAnalysis(){ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@定时任务" + df.format(new Date())); try { synchronized (OrderDataInsertService.pendingArray) {//重点在synchronized方法上 HashSetnewList = orderDataAnalysisService.fileParsingGetData(newfilePath+new SimpleDateFormat("yyyyMMdd").format(new Date()),oldfilePath);//新 if(newList!=null){ int pendingSize; pendingSize = OrderDataInsertService.pendingArray.size(); //判断文件名称是否重复 OrderDataInsertService.pendingArray.addAll(newList); if(pendingSize == 0){ orderDataInsertService.fileParsingGetData(newfilePath+new SimpleDateFormat("yyyyMMdd").format(new Date()),oldfilePath); } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); logger.info("ErrCode:-------错误描述"); } } 3、synchronized应用的具体方法实现
/** * * @return 获取交易数据文件 解析并保存 */ public void fileParsingGetData(String newfilePath,String oldfilePath){ int index = 0; TvipReturnDataType listName = new TvipReturnDataType(); ListnewStrArrays = new ArrayList<>();//成功数据 //解析已被复制的二进制文件 遍历所有的文件信息,将数据解析放入list集合中 List listAll = new ArrayList (); while(pendingArray.size()>0){ index++; doProcess(newfilePath,oldfilePath); } if(pendingArray.size() == 0){ logger.info("==============================TRX文件上传文件夹为空,已操作文件个数:"+index); index=0; } } @Transactional private void doProcess(String newfilePath,String oldfilePath){ String filePath = pendingArray.iterator().next(); System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"+pendingArray.size()+filePath); try { synchronized (pendingArray) { List errorStrArrays = new ArrayList<>();//错误数据 String fileName = filePath; filePath = newfilePath+connector+filePath; String headerFile = "";//头文件 String fileData = "";//数据 String crcData = "";//crc数据文件 File file1 = new File(filePath); byte[] bytes = ByteFileAnalysisUtilEntity.File2byte(file1); String[] listString = ByteFileAnalysisUtilEntity.byte2HexString(bytes).split("0D0A0D0A0D0A"); for(int i = 0;i