From 70f6d3bb43c2906538fa3b1940919a808efe2e80 Mon Sep 17 00:00:00 2001 From: 杜洪波 <1074825718@qq.com> Date: 星期二, 17 六月 2025 14:46:54 +0800 Subject: [PATCH] Squashed commit of the following: --- src/main/java/com/product/system/backup/service/SystemBackupService2.java | 455 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/product/system/backup/service/SystemBackupService.java | 9 2 files changed, 461 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/product/system/backup/service/SystemBackupService.java b/src/main/java/com/product/system/backup/service/SystemBackupService.java index 4acbe44..203789a 100644 --- a/src/main/java/com/product/system/backup/service/SystemBackupService.java +++ b/src/main/java/com/product/system/backup/service/SystemBackupService.java @@ -34,7 +34,7 @@ * 闄勪欢澶囦唤锛氭瘡澶╂墽琛屼唬鐮佸浠藉綋澶╅檮浠� * 閬楃暀闂锛氶檮浠惰淇敼锛屼笉鑳介攣瀹氶潪褰撳ぉ琚慨鏀圭殑闄勪欢 */ -@Service("systemBackService") +@Service("systemBackService1") public class SystemBackupService { // 澶囦唤閰嶇疆 @@ -105,7 +105,7 @@ log.writeInfo("銆愮郴缁熷浠借繘绋嬨�戠郴缁熷浠借繘绋嬬粨鏉燂紝鑰楁椂.................." + ((end - start) / 1000) + "绉�", BackupLogger.INFO_TYPE); System.out.println("绯荤粺澶囦唤鑰楁椂.................." + ((end - start) / 1000) + "绉�"); } - + /** * 绗竴姝ワ細鍒濆閰嶇疆鏂囦欢鍙傛暟,褰撳墠鐩綍鐢熸垚鏃堕棿鎴崇殑鏂囦欢澶� */ @@ -118,8 +118,11 @@ // 璇诲彇澶囦唤閰嶇疆鏂囦欢 config = new Properties(); config.load(reader); + // 鑾峰彇绯荤粺鏂囦欢璺緞 + String systemFileFolder = Global.getSystemConfig("local.dir", ""); + File newFile= new File(systemFileFolder); // 绯荤粺闄勪欢瀛樻斁鐩綍(褰撳ぉ闄勪欢) - config.setProperty("DOCUMENT_ROOT", System.getProperty("user.dir") + File.separator + Global.getSystemConfig("local.dir", "") + File.separator + "00000000-0000-0000-0000-000000000000" + File.separator + NUMBER_DATE); + config.setProperty("DOCUMENT_ROOT", newFile.getAbsolutePath() + File.separator + "00000000-0000-0000-0000-000000000000" + File.separator + NUMBER_DATE); // 鏁版嵁搴撳浠界洰褰曪紙鏁版嵁搴撳浠芥牴鐩綍+鏃堕棿鏂囦欢鍚�+.sql锛� config.setProperty("DATABASE_BACKUP", config.getProperty("DATABASE_ROOT") + File.separator + NUMBER_TIME + ".sql"); // 澶囦唤鐩爣鏂囦欢锛圸IP澶囦唤鏍圭洰褰�+鏃堕棿鏂囦欢鍚�+.zip锛� diff --git a/src/main/java/com/product/system/backup/service/SystemBackupService2.java b/src/main/java/com/product/system/backup/service/SystemBackupService2.java new file mode 100644 index 0000000..4ff3122 --- /dev/null +++ b/src/main/java/com/product/system/backup/service/SystemBackupService2.java @@ -0,0 +1,455 @@ +package com.product.system.backup.service; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.alibaba.druid.util.StringUtils; +import com.jcraft.jsch.Channel; +import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; +import com.jcraft.jsch.SftpException; +import com.jcraft.jsch.SftpProgressMonitor; +import com.product.core.config.Global; +import com.product.core.dao.BaseDao; +import com.product.core.entity.DataTableEntity; +import com.product.core.entity.FieldSetEntity; +import com.product.core.service.support.AbstractBaseService; +import com.product.system.backup.entity.BackupLogger; + +@Service("systemBackService") +public class SystemBackupService2 extends AbstractBaseService{ + + @Autowired + BaseDao baseDao; + + // 澶囦唤閰嶇疆 + Properties config; + + // 澶囦唤鏃ュ織 + BackupLogger log; + + // 鏁板瓧鏃堕棿鍜屾暟瀛楁棩鏈燂紙鐢ㄥ仛鏂囦欢澶规垨鑰呮枃浠跺悕锛� + String NUMBER_TIME; //渚嬪锛�20250428091001锛� + String NUMBER_DATE; //渚嬪锛�20240428锛� + String STANDARD_START_TIME; // 渚嬪锛�2024-04-28 09:10:00锛� + String STANDARD_FINAL_TIME; // 渚嬪锛�2024-04-28 09:10:00锛� + + // 鏁板瓧鏃ユ湡鏍煎紡 + SimpleDateFormat numberTimeFormat = new SimpleDateFormat("yyyyMMddHHmm00"); + SimpleDateFormat numberDateFormat = new SimpleDateFormat("yyyyMMdd"); + SimpleDateFormat standardTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:00"); + + // 澶囦唤閰嶇疆鏂囦欢 + private static final String CONFIG_FILE_PATH = "systemBackup.properties"; + + /** + * 绯荤粺澶囦唤鍒ゅ畾 + * 璋冪敤鍦扮偣锛氬畾鏃朵换鍔¢厤缃姛鑳�(bean) + */ + public void systemBackupInit() { + // 鑾峰彇绯荤粺鏃堕棿 + Date finalTime = new Date(); + Date startTime = null; + // 鑾峰彇绯荤粺澶囦唤鍛ㄦ湡(鍒嗛挓) + int backupCycle = Integer.valueOf(Global.getSystemConfig("SYSTEM_BACK_CYCLE", "20")); + // 鑾峰彇绯荤粺鏈�澶у浠芥椂闂� + StringBuilder sbSql = new StringBuilder(); + sbSql.append("SELECT TIMESTAMPDIFF(MINUTE, end_time, ?) AS diff_minutes,end_time \n"); + sbSql.append("FROM product_sys_backup_log \n"); + sbSql.append("WHERE backup_status = 1 \n"); + sbSql.append("ORDER BY end_time DESC \n"); + sbSql.append("LIMIT 1 \n"); + FieldSetEntity fseMaxLogTime = baseDao.getFieldSetEntityBySQL(sbSql.toString(), new Object[] {standardTimeFormat.format(finalTime)}, false); + if(fseMaxLogTime != null && !StringUtils.isEmpty(fseMaxLogTime.getString("diff_minutes"))) { + Integer diffMinutes = fseMaxLogTime.getInteger("diff_minutes"); + if (diffMinutes < backupCycle) { + // 灏忎簬澶囦唤鍛ㄦ湡锛屼笉澶囦唤 + return ; + } + startTime = fseMaxLogTime.getDate("end_time"); + } + try { + // 鎵ц澶囦唤 + systemBackup(startTime, finalTime); + } catch (Exception e) { + e.printStackTrace(); + } + FieldSetEntity fseBackLog = new FieldSetEntity("product_sys_backup_log"); + fseBackLog.setValue("start_time", startTime); + fseBackLog.setValue("end_time", finalTime); + fseBackLog.setValue("backup_status", 1); + baseDao.saveFieldSetEntity(fseBackLog); + } + + /** + * 绯荤粺澶囦唤鍏ュ彛 + * + */ + public void systemBackup(Date startTime, Date finalTime){ + + // 鍒濆鏃ュ織鏂囦欢 + log = new BackupLogger(); + // 鍦ㄦ棩蹇椾腑璁板綍鎿嶄綔绯荤粺淇℃伅锛屼究浜庤皟璇� + log.writeInfo("銆愮郴缁熷浠藉叆鍙c�戞搷浣滅郴缁�: " + System.getProperty("os.name"), BackupLogger.INFO_TYPE); + log.writeInfo("銆愮郴缁熷浠藉叆鍙c�戞枃浠跺垎闅旂: " + File.separator, BackupLogger.INFO_TYPE); + log.writeInfo("銆愮郴缁熷浠藉叆鍙c�戠郴缁熷浠藉紑濮�..................", BackupLogger.INFO_TYPE); + NUMBER_TIME = numberTimeFormat.format(finalTime); + NUMBER_DATE = numberDateFormat.format(finalTime); + if(startTime == null) { + STANDARD_START_TIME = "2000-01-01 00:00:00"; + } else { + STANDARD_START_TIME = standardTimeFormat.format(startTime); + } + STANDARD_FINAL_TIME = standardTimeFormat.format(finalTime); + log.writeInfo("銆愮郴缁熷浠藉叆鍙c�戠郴缁熸棩鏈燂細" + NUMBER_DATE, BackupLogger.INFO_TYPE); + log.writeInfo("銆愮郴缁熷浠藉叆鍙c�戠郴缁熸椂闂达細" + NUMBER_TIME, BackupLogger.INFO_TYPE); + log.writeInfo("銆愮郴缁熸湰鍒嗗叆鍙c�戠郴缁熷浠藉紑濮嬫椂闂达細" + STANDARD_START_TIME, BackupLogger.INFO_TYPE); + log.writeInfo("銆愮郴缁熷浠藉叆鍙c�戠郴缁熷浠芥埅姝㈡椂闂达細" + STANDARD_FINAL_TIME, BackupLogger.INFO_TYPE); + // 杩涘叆澶囦唤杩涚▼ + backupProcess(); + log.closeLogger(); + } + + /** + * 鏁版嵁澶囦唤杩涚▼ + */ + public void backupProcess() { + log.writeInfo("銆愮郴缁熷浠借繘绋嬨�戠郴缁熷浠借繘绋嬪紑濮�..................", BackupLogger.INFO_TYPE); + long start = System.currentTimeMillis(); + boolean status= true; + // 绗竴姝ワ細鍒濆閰嶆枃浠跺弬鏁�,褰撳墠鐩敓鎴愭椂闂存埑鐨勬枃浠跺す + status = initSystemConfig(); + if (!status) + return; + // 绗簩姝ワ細鎵ц鏁版嵁搴撳浠� + status = runExpDataBase(); + if (!status) + return; + // 绗笁姝ワ細鎵ц瀵规暟鎹簱鏂囦欢銆佸伐绋嬩唬鐮併�佷笂浼犳枃浠跺仛鍘嬬缉澶囦唤 + status = zipDataBackup(); + if (!status) + return; + // 绗洓姝ワ細涓婁紶鍘嬬缉澶囦唤鏂囦欢鍒癋TP + status = sftpTransferService(); + if (!status) + return; + // 绗簲姝ワ細娓呴櫎鏁版嵁 +// clearKeepData(); + + long end = System.currentTimeMillis(); + log.writeInfo("銆愮郴缁熷浠借繘绋嬨�戠郴缁熷浠借繘绋嬬粨鏉燂紝鑰楁椂.................." + ((end - start) / 1000) + "绉�", BackupLogger.INFO_TYPE); + System.out.println("绯荤粺澶囦唤鑰楁椂.................." + ((end - start) / 1000) + "绉�"); + } + + /** + * 绗竴姝ワ細鍒濆閰嶇疆鏂囦欢鍙傛暟,褰撳墠鐩綍鐢熸垚鏃堕棿鎴崇殑鏂囦欢澶� + */ + public boolean initSystemConfig() { + log.writeInfo("銆愬垵濮嬮厤缃枃浠躲�戝紑濮嬪垵濮嬬郴缁熼厤缃枃浠�..................", BackupLogger.INFO_TYPE); + try (InputStream reader = getClass().getClassLoader().getResourceAsStream(CONFIG_FILE_PATH)) { + if (reader == null) { + log.writeInfo("銆愬垵濮嬮厤缃枃浠躲�戝垵濮嬬郴缁熼厤缃枃浠跺け璐ワ細" + CONFIG_FILE_PATH + "閰嶇疆鏂囦欢涓嶅瓨鍦�", BackupLogger.ERROR_TYPE); + } + // 璇诲彇澶囦唤閰嶇疆鏂囦欢 + config = new Properties(); + config.load(reader); + // 鑾峰彇绯荤粺鏂囦欢璺緞 + String systemFileFolder = Global.getSystemConfig("local.dir", ""); + File newFile= new File(systemFileFolder); + // 绯荤粺闄勪欢瀛樻斁鐩綍 + config.setProperty("DOCUMENT_ROOT", newFile.getAbsolutePath() + File.separator + "00000000-0000-0000-0000-000000000000"); + // 鏁版嵁搴撳浠界洰褰曪紙鏁版嵁搴撳浠芥牴鐩綍+鏃堕棿鏂囦欢鍚�+.sql锛� + config.setProperty("DATABASE_BACKUP", config.getProperty("DATABASE_ROOT") + File.separator + NUMBER_TIME + ".sql"); + // 澶囦唤鐩爣鏂囦欢锛圸IP澶囦唤鏍圭洰褰�+鏃堕棿鏂囦欢鍚�+.zip锛� + config.setProperty("ZIPFILE_BACKUP", config.getProperty("ZIPFILE_ROOT") + File.separator + NUMBER_TIME + ".zip"); + // 鍒涘缓ZIP鏂囦欢鏍圭洰褰� + File zipFileRoot = new File(config.getProperty("ZIPFILE_ROOT")); + if (!zipFileRoot.exists()) { + if (!zipFileRoot.mkdirs()) { + log.writeInfo("銆愬垵濮嬮厤缃枃浠躲�戞棤娉曞垱寤虹洰褰�: " + zipFileRoot.getAbsolutePath(), BackupLogger.ERROR_TYPE); + return false; + } + } + log.writeInfo("銆愬垵濮嬮厤缃枃浠躲�慏ATABASE_ROOT=" + config.getProperty("DATABASE_ROOT"), BackupLogger.INFO_TYPE); + log.writeInfo("銆愬垵濮嬮厤缃枃浠躲�慏ATABASE_BACKUP=" + config.getProperty("DATABASE_BACKUP"), BackupLogger.INFO_TYPE); + log.writeInfo("銆愬垵濮嬮厤缃枃浠躲�慏OCUMENT_ROOT=" + config.getProperty("DOCUMENT_ROOT"), BackupLogger.INFO_TYPE); + log.writeInfo("銆愬垵濮嬮厤缃枃浠躲�慏OCUMENT_BACKUP=" + config.getProperty("DOCUMENT_BACKUP"), BackupLogger.INFO_TYPE); + log.writeInfo("銆愬垵濮嬮厤缃枃浠躲�慫IPFILE_ROOT=" + config.getProperty("ZIPFILE_ROOT"), BackupLogger.INFO_TYPE); + log.writeInfo("銆愬垵濮嬮厤缃枃浠躲�慫IPFILE_BACKUP=" + config.getProperty("ZIPFILE_BACKUP"), BackupLogger.INFO_TYPE); + log.writeInfo("銆愬垵濮嬮厤缃枃浠躲�戝垵濮嬬郴缁熼厤缃枃浠剁粨鏉�.................", BackupLogger.INFO_TYPE); + } catch (Exception e) { + e.printStackTrace(); + log.writeInfo("銆愬垵濮嬮厤缃枃浠躲�戠郴缁熷垵濮嬮厤缃枃浠跺け璐�," + new File("config.properties").getAbsolutePath() + "," + e.getMessage(), + BackupLogger.ERROR_TYPE); + return false; + } + return true; + } + + /** + * 绗簩姝ワ細澶囦唤鏁版嵁搴撴枃浠� + */ + public boolean runExpDataBase() { + log.writeInfo("銆愬浠芥暟鎹簱銆戝紑濮嬪浠芥暟鎹簱..................", BackupLogger.INFO_TYPE); + String databaseHost = config.getProperty("DATABASE_HOST"); + String databasePort = config.getProperty("DATABASE_PORT"); + String databaseName = config.getProperty("DATABASE_NAME"); + String databaseUser = config.getProperty("DATABASE_USER"); + String databasePwd = config.getProperty("DATABASE_PWD"); + + log.writeInfo("銆愬浠芥暟鎹簱銆戞暟鎹簱HOST锛�" + databaseHost, BackupLogger.INFO_TYPE); + log.writeInfo("銆愬浠芥暟鎹簱銆戞暟鎹簱PORT锛�" + databasePort, BackupLogger.INFO_TYPE); + + File backupFile = new File(config.getProperty("DATABASE_BACKUP")); + + // 纭繚澶囦唤鏂囦欢鐨勭洰褰曞瓨鍦� + if (!backupFile.getParentFile().exists()) { + backupFile.getParentFile().mkdirs(); + } + log.writeInfo("銆愬浠芥暟鎹簱銆戞暟鎹簱澶囦唤鏂囦欢瀹屾暣鐩綍锛�" + backupFile.getAbsolutePath(), BackupLogger.INFO_TYPE); + + ProcessBuilder processBuilder = new ProcessBuilder( + "mysqldump", + "-h" + databaseHost, + "-P" + databasePort, + "-u" + databaseUser, + "-p" + databasePwd, + databaseName + ); + + try { + Process process = processBuilder.start(); + // 璇诲彇mysqldump鐨勮緭鍑哄苟鍐欏叆鍒板浠芥枃浠� + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8)); + FileWriter writer = new FileWriter(backupFile)) { + + String line; + while ((line = reader.readLine()) != null) { + writer.write(line + System.lineSeparator()); + } + } + + // 璇诲彇閿欒娴佸苟璁板綍鏃ュ織 + try (BufferedReader errorReader = new BufferedReader( + new InputStreamReader(process.getErrorStream(), StandardCharsets.UTF_8))) { + String errorLine; + while ((errorLine = errorReader.readLine()) != null) { + log.writeInfo("銆愬浠芥暟鎹簱銆戦敊璇緭鍑�: " + errorLine, BackupLogger.ERROR_TYPE); + } + } + + int exitCode = process.waitFor(); + if (exitCode == 0) { + log.writeInfo("銆愬浠芥暟鎹簱銆戞暟鎹簱澶囦唤鎴愬姛锛�" + backupFile.getAbsolutePath(), BackupLogger.INFO_TYPE); +// if (!"127.0.0.1".equals(databaseHost)) { + // 鑾峰彇鏁版嵁搴撳浠芥枃浠� +// return sftpTransferService(false); +// } + } else { + log.writeInfo("銆愬浠芥暟鎹簱銆戞暟鎹簱澶囦唤澶辫触锛岄��鍑虹爜: " + exitCode, BackupLogger.ERROR_TYPE); + } + } catch (Exception e) { + e.printStackTrace(); + log.writeInfo("銆愬浠芥暟鎹簱銆戞暟鎹簱澶囦唤澶辫触锛�" + e.getMessage(), BackupLogger.ERROR_TYPE); + return false; + } + return true; + } + + private static void addFileToZip(File file, String entryName, ZipOutputStream zos) throws IOException { + try (FileInputStream fis = new FileInputStream(file)) { + zos.putNextEntry(new ZipEntry(entryName)); + byte[] buffer = new byte[1024]; + int length; + while ((length = fis.read(buffer)) >= 0) { + zos.write(buffer, 0, length); + } + zos.closeEntry(); + } + } + + /** + * 鍘嬬缉澧為噺闄勪欢 + * @param groupFolderFile 澧為噺鏂囦欢澶癸紝鏂囦欢鍚� + * @param baseDir 闄勪欢鏍圭洰褰� + * @param outputZipPath 鍘嬬缉鏂囦欢 + * @throws IOException + */ + public static void compressExistingFiles(Map<Integer, List<String>> groupFolderFile, String baseDir, ZipOutputStream zos) throws IOException { + for (Map.Entry<Integer, List<String>> entry : groupFolderFile.entrySet()) { + int folderName = entry.getKey(); // 鏂囦欢澶瑰悕锛堝 20250611锛� + List<String> files = entry.getValue(); // 璇ユ枃浠跺す涓嬬殑鏂囦欢鍚嶅垪琛� + Path folderPath = Paths.get(baseDir).resolve(String.valueOf(folderName)); + for (String fileName : files) { + Path filePath = folderPath.resolve(fileName); + // 妫�鏌ユ枃浠舵槸鍚﹀瓨鍦� + if (Files.exists(filePath) && !Files.isDirectory(filePath)) { + // 璁$畻 ZIP 鍐呯殑鐩稿璺緞锛堝 "20250611/file1.txt"锛� + ZipEntry zipEntry = new ZipEntry( + String.valueOf(folderName) + "/" + fileName + ); + zos.putNextEntry(zipEntry); + + // 鍐欏叆鏂囦欢鍐呭鍒� ZIP + Files.copy(filePath, zos); + zos.closeEntry(); + } else { + System.err.println("鏂囦欢涓嶅瓨鍦ㄦ垨涓嶆槸鏂囦欢: " + filePath); + } + } + } + } + + public boolean zipDataBackup() { + log.writeInfo("銆愬帇缂╁浠芥枃浠躲�戝紑濮嬪帇缂╁浠芥枃浠�..................", BackupLogger.INFO_TYPE); + String documentPath = config.getProperty("DOCUMENT_ROOT"); + String databasePath = config.getProperty("DATABASE_BACKUP"); + String zipFilePath = config.getProperty("ZIPFILE_BACKUP"); + log.writeInfo("銆愬帇缂╁浠芥枃浠躲�戦檮浠跺瓨鍌ㄧ洰褰曡矾寰勶細" + documentPath, BackupLogger.INFO_TYPE); + log.writeInfo("銆愬帇缂╁浠芥枃浠躲�戞暟鎹簱澶囦唤瀹屾暣璺緞锛�" + databasePath, BackupLogger.INFO_TYPE); + log.writeInfo("銆愬帇缂╁浠芥枃浠躲�戝浠藉帇缂╂枃浠跺畬鏁磋矾寰勶細" + zipFilePath, BackupLogger.INFO_TYPE); + + try (FileOutputStream fos = new FileOutputStream(zipFilePath); + ZipOutputStream zos = new ZipOutputStream(fos)){ + StringBuilder sbSql = new StringBuilder(); + sbSql.append("SELECT SUBSTRING_INDEX(attachment_url, '/', -1) id,attachment_title AS uuid,attachment_url \n"); + sbSql.append("FROM product_sys_attachments \n"); + sbSql.append("WHERE (created_utc_datetime > ? AND created_utc_datetime <= ?) \n"); + sbSql.append("AND (updated_utc_datetime > ? AND updated_utc_datetime <= ?) \n"); + DataTableEntity dtTable = baseDao.listTable(sbSql.toString(), new Object[] {STANDARD_START_TIME, STANDARD_FINAL_TIME, STANDARD_START_TIME, STANDARD_FINAL_TIME}); + if(dtTable != null && dtTable.getRows() > 0) { + Map<Integer, List<String>> groupFolderFile = dtTable.getData().stream() + .collect(Collectors.groupingBy( + FieldSetEntity::getId, + Collectors.mapping( + FieldSetEntity::getUUID, + Collectors.toList() + ) + )); + log.writeInfo("銆愬帇缂╁浠芥枃浠躲�戝帇缂╃郴缁熷閲忛檮浠�", BackupLogger.INFO_TYPE); + compressExistingFiles(groupFolderFile, documentPath, zos); + } + + log.writeInfo("銆愬帇缂╁浠芥枃浠躲�戝帇缂╂暟鎹簱澶囦唤鏂囦欢", BackupLogger.INFO_TYPE); + // 鍘嬬缉SQL鏂囦欢锛堟斁鍦ㄦ寚瀹氳矾寰勪笅锛� + addFileToZip(new File(databasePath), "database/" + NUMBER_TIME + ".sql", zos); + log.writeInfo("銆愬帇缂╁浠芥枃浠躲�戝帇缂╁畬鎴�", BackupLogger.INFO_TYPE); + } catch (IOException e) { + e.printStackTrace(); + } finally { + File file = new File(databasePath); + file.delete(); + log.writeInfo("銆愬帇缂╁浠芥枃浠躲�戞竻鐞嗘暟鎹簱澶囦唤鏂囦欢瀹屾垚", BackupLogger.INFO_TYPE); + } + return false; + } + + /** + * SFTP杩炴帴锛氶�氳繃SFTP灏嗗浠芥枃浠朵笂浼犲鐢ㄦ満 鎴� 浠巑ysql鏈嶅姟鍣ㄤ笂鑾峰彇澶囦唤鏂囦欢 + * @param isUpload 鏄惁涓婁紶 + * @return + */ + public boolean sftpTransferService() { + String sftpTitle = "涓婁紶绯荤粺澶囦唤鏂囦欢";; + String localFilePath = config.getProperty("ZIPFILE_BACKUP"); // 鏈湴鏂囦欢璺緞 + String sftpFilePath = config.getProperty("UPLOAD_BACKUP_DIR") + NUMBER_TIME + ".zip"; // SFTP鏈嶅姟鏂囦欢璺緞; + + String host = config.getProperty("UPLOAD_SFTP_HOST"); // SFTP鏈嶅姟IP鍦板潃 + String port = config.getProperty("UPLOAD_SFTP_PORT"); // SSH绔彛 + String user = config.getProperty("UPLOAD_SFTP_USER"); // SFTP鏈嶅姟鐨勭敤鎴峰悕 + String password = config.getProperty("UPLOAD_SFTP_PWD"); // SFTP鏈嶅姟鐨勫瘑鐮� + log.writeInfo(String.format("銆�%s銆戝紑濮�%s..................", sftpTitle, sftpTitle), BackupLogger.INFO_TYPE); + log.writeInfo(String.format("銆�%s銆慡FTP鏈嶅姟鍦板潃锛�", sftpTitle) + host, BackupLogger.INFO_TYPE); + log.writeInfo(String.format("銆�%s銆慡FTP鏈嶅姟绔彛锛�", sftpTitle) + port, BackupLogger.INFO_TYPE); + log.writeInfo(String.format("銆�%s銆慡FTP鏈嶅姟瀛樺偍鐩綍锛�", sftpTitle) + sftpFilePath, BackupLogger.INFO_TYPE); + log.writeInfo(String.format("銆�%s銆戝綋鍓嶆湇鍔″瓨鍌ㄧ洰褰曪細", sftpTitle) + localFilePath, BackupLogger.INFO_TYPE); + if (StringUtils.isEmpty(host) || StringUtils.isEmpty(port) || StringUtils.isEmpty(user) || StringUtils.isEmpty(password)) { + log.writeInfo(String.format("銆�%s銆慡FTP淇℃伅鏈厤缃畬鏁达紝涓嶄簣杩炴帴浼犺緭鏂囦欢", sftpTitle), BackupLogger.INFO_TYPE); + return true; + } + try { + JSch jsch = new JSch(); + Session session = jsch.getSession(user, host, Integer.valueOf(port)); + session.setPassword(password); + session.setConfig("StrictHostKeyChecking", "no"); // 浠呴檺娴嬭瘯鐜 + session.connect(5000); // 璁剧疆杩炴帴瓒呮椂鏃堕棿 + + Channel channel = session.openChannel("sftp"); + channel.connect(5000); // 璁剧疆閫氶亾瓒呮椂鏃堕棿 + ChannelSftp sftpChannel = (ChannelSftp) channel; + + // 纭繚鐩綍瀛樺湪锛堝叧閿楠わ級 + String remoteDir = sftpFilePath.substring(0, sftpFilePath.lastIndexOf('/')); + if (!remoteDir.startsWith("/")) { + remoteDir = "/" + remoteDir; + } + // 鍒涘缓瀵瑰簲鐩綍鏂囦欢澶� + createRemoteDirectory(sftpChannel, remoteDir); + sftpChannel.put(localFilePath, sftpFilePath, new SftpProgressMonitor() { + public void init(int op, String src, String dest, long max) { + log.writeInfo("銆愪笂浼犵郴缁熷浠芥枃浠躲�戝紑濮嬩紶杈�: " + src + " -> " + dest, BackupLogger.INFO_TYPE); + } + public boolean count(long count) { return true; } + public void end() { log.writeInfo("銆愪笂浼犵郴缁熷浠芥枃浠躲�戜紶杈撳畬鎴�", BackupLogger.INFO_TYPE); } + }); + sftpChannel.exit(); + session.disconnect(); + log.writeInfo(String.format("銆�%s銆�%s鎴愬姛", sftpTitle, sftpTitle), BackupLogger.INFO_TYPE); + } catch (JSchException | SftpException e) { + e.printStackTrace(); + log.writeInfo(String.format("銆�%s銆�%s澶辫触锛�", sftpTitle, sftpTitle) + e.getMessage(), BackupLogger.ERROR_TYPE); + return false; + } + return true; + } + + /** + * SFTP閫掑綊鍒涘缓杩滅▼鐩綍 + * @param sftpChannel + * @param remoteDir + * @throws SftpException + */ + private void createRemoteDirectory(ChannelSftp sftpChannel, String remoteDir) throws SftpException { + try { + sftpChannel.cd(remoteDir); + } catch (SftpException e) { + if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) { + if (remoteDir.length() == 3 && remoteDir.charAt(1) == ':') { + // 璺宠繃鏍圭洰褰� + return; + } + int pos = remoteDir.lastIndexOf('/'); + if (pos > 0) { + createRemoteDirectory(sftpChannel, remoteDir.substring(0, pos)); + } + sftpChannel.mkdir(remoteDir); + log.writeInfo("銆愪笂浼犲浠芥枃浠躲�戝垱寤虹洰褰曟垚鍔�: " + remoteDir, BackupLogger.INFO_TYPE); + } else { + throw e; + } + } + } +} -- Gitblit v1.9.2