package com.platform.service.thread; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.Resource; import org.apache.log4j.Logger; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import com.platform.dao.DataInfoDao; import com.platform.dao.DataInfoMoveTmpDao; import com.platform.dao.GatherOracleDao; import com.platform.entities.DataInfoEntity; import com.platform.entities.DataInfoEntityMoveTmp; import com.platform.entities.GatherOracleInfo; import com.platform.glusterfs.CheckoutMD5; import com.platform.glusterfs.CopyData; import com.platform.glusterfs.ShowData; import com.platform.service.DataInfoService; import com.platform.service.DataInfoServiceImp; import com.platform.service.IMoveDataService; import com.platform.service.impl.MoveDataServiceImpl; import com.platform.utils.Bean2MapUtils; import com.platform.utils.Constant; import com.platform.utils.DateForm; @Component public class ThreadMoveData{ public static Logger log = Logger.getLogger(ThreadMoveData.class); @Resource(name = "dataInfoDao") private DataInfoDao dataInfoDao; /** * 迁移 */ CopyData copy = new CopyData(); /** * MD5校验 */ CheckoutMD5 check = new CheckoutMD5(); @Resource(name = "dataInfoMoveTmpDao") private DataInfoMoveTmpDao dataInfoMoveTmpDao; /** * 查看数据 */ ShowData show = new ShowData(); /** * : 实时更新数据库--根据查询到的 正则迁移的数据 */ public ThreadMoveData() { } //5秒 @Scheduled(fixedDelay = 5000) public void doSomething() { try { List result = null; //查询 表 move_data_tmp result = dataInfoMoveTmpDao.findAll(); if (null != result) { //gfs 获取size, int rsize = result.size(); boolean isNoMove = true; //该循环必须 循环每个,不能有 break; // rate:大小:假的,待换成真实比例 double realRate = 0.00; int moveFileCurrNum = 0; for (int i = 0; i < rsize; i++) { DataInfoEntityMoveTmp dataMove = result.get(i); //如果拷贝进度超过20分钟未进行-- 判断为 迁移失败。 // "1" :正在上传,0:等待 迁移, 2:成功 3:失败 if ("1".equals(dataMove.getCompleteStatus())) { long nowTime = new Date().getTime(); long timelong = nowTime - DateForm.string2DateBysecond(dataMove.getLastTime()).getTime(); if (timelong > 1000*60*20) { dataMove.setCompleteStatus("3"); dataInfoMoveTmpDao.update(dataMove); } //正在上传的个数。 moveFileCurrNum++; if (moveFileCurrNum >= Constant.moveFileMaxNum) { isNoMove = false; } // 查询大小:。//gfs 获取size, long srcSize = show.getFolderSize(dataMove.getDataPath()); long dstSize = show.getFolderSize(dataMove.getDstPath()); if (srcSize < 0) { log.error(dataMove.getDataPath() + " : 路径不存在! "); continue; } if (dstSize < 0) { log.error(dataMove.getDstPath() + " : 路径不存在! "); continue; } if (srcSize > 0 && dstSize > 0) { realRate = (dstSize*100 / srcSize ); dataMove.setLastTime(DateForm.date2StringBysecond(new Date())); } if (srcSize == dstSize) { realRate = 100; } dataMove.setRate((int) realRate); } if("1".equals(dataMove.getCompleteStatus()) && dataMove.getRate() > 0){ //传输完毕:进行校验 if (realRate == 100) { //TODO 进行MD5校验 int resl = check.checkoutMD5Folder(dataMove.getDataPath(), dataMove.getDstPath()); //TODO 校验成功--则删除数据库记录 if(resl == 1){ //校验成功--修改 数据库记录-- dataMove.setCompleteStatus("2"); dataMove.setLastTime(DateForm.date2StringBysecond(new Date())); dataInfoMoveTmpDao.update(dataMove); //TODO 新增 一条数据-到-dataInfo DataInfoEntity data = (DataInfoEntity) Bean2MapUtils.convertMap( DataInfoEntity.class, Bean2MapUtils.convertBean(dataMove)); data.setDataPath(dataMove.getDstPath()); data.setVolumeIp(dataMove.getDstVolumeIp()); data.setVolumePath(dataMove.getDstVolumePath()); data.setYear(DateForm.date2StringByMin(new Date())); dataInfoDao.save(data); } else { // 3:表示 迁移失败 dataMove.setCompleteStatus("3"); } } dataMove.setLastTime(DateForm.date2StringBysecond(new Date())); dataInfoMoveTmpDao.update(dataMove); } } //循环 完了, 确定没有上传的 ,没有正在上传的 if (isNoMove) { //查询 表 move_data_tmp result = dataInfoMoveTmpDao.findAll(); if (null != result) { int tmpsize = result.size(); // 上传下一个后 for (int i = 0; i < tmpsize; i++) { DataInfoEntityMoveTmp next2move = result.get(i); //如果是 待 迁移状态的 if ("0".equals(next2move.getCompleteStatus())) { //待迁移的数据 -- 开始迁移 // 末尾 含有 / Pattern pattern2 = Pattern.compile("\\/$"); String dstPath = next2move.getDataPath(); Matcher matcher2 = pattern2.matcher(dstPath); //去掉 最后 的 / 符合 if (matcher2.find()) { dstPath = dstPath.substring(0, dstPath.length()-1); } //数据迁移。 copy.copyFolder(dstPath+"/app", next2move.getDstPath()); // "1" :正在上传,0:等待 迁移, 2:成功 3:失败 next2move.setCompleteStatus("1"); next2move.setLastTime(DateForm.date2StringBysecond(new Date())); //更新sql dataInfoMoveTmpDao.update(next2move); break; } } } } } Thread.sleep(Constant.update_dataInfo_sleep_time); } catch (Exception e) { System.err.println(e); } } }