From 1c7839afa6e1d8eefa4af8f316c45e6dc51966cf Mon Sep 17 00:00:00 2001 From: huangfeng Date: Wed, 25 Sep 2024 16:08:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E6=9C=AC=E5=9C=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RemoteConfigController.java | 3 +- .../com/xydl/cac/entity/RemoteDownload.java | 4 + .../repository/RemoteDownloadRepository.java | 3 + .../cac/service/RemoteDownloadService.java | 3 + .../impl/RemoteDownloadServiceImpl.java | 17 +++ .../com/xydl/cac/task/SftpDownloadTask.java | 119 ++++++++++++++++++ src/main/java/com/xydl/cac/util/SFTPTool.java | 17 ++- src/main/resources/application-dev.yml | 3 +- src/main/resources/application-prod.yml | 1 + 9 files changed, 157 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/xydl/cac/task/SftpDownloadTask.java diff --git a/src/main/java/com/xydl/cac/controller/RemoteConfigController.java b/src/main/java/com/xydl/cac/controller/RemoteConfigController.java index 9701a03..bb4a7c9 100644 --- a/src/main/java/com/xydl/cac/controller/RemoteConfigController.java +++ b/src/main/java/com/xydl/cac/controller/RemoteConfigController.java @@ -29,8 +29,6 @@ public class RemoteConfigController extends BasicController { RemoteConfigService configService; @Resource RemoteDownloadService downloadService; - @Resource - SFTPTool sftpTool; @GetMapping("listAll") @ApiOperation("查询全部列表") @@ -70,6 +68,7 @@ public class RemoteConfigController extends BasicController { @ApiOperation("测试") public Response test(Integer id) throws Exception { RemoteConfig item = configService.get(id); + SFTPTool sftpTool = new SFTPTool(); sftpTool.connect(item.getIp(), item.getPort(), item.getUser(), item.getPasswd()); sftpTool.disconnect(); return Response.success("正常"); diff --git a/src/main/java/com/xydl/cac/entity/RemoteDownload.java b/src/main/java/com/xydl/cac/entity/RemoteDownload.java index fccbd06..42c04d4 100644 --- a/src/main/java/com/xydl/cac/entity/RemoteDownload.java +++ b/src/main/java/com/xydl/cac/entity/RemoteDownload.java @@ -30,6 +30,10 @@ public class RemoteDownload { @Column(name = "config_id") private Integer configId; + @ApiModelProperty("路径") + @Column(name = "remote_path") + private String remotePath; + @ApiModelProperty("路径") @Column(name = "path") private String path; diff --git a/src/main/java/com/xydl/cac/repository/RemoteDownloadRepository.java b/src/main/java/com/xydl/cac/repository/RemoteDownloadRepository.java index 6103516..0b44f32 100644 --- a/src/main/java/com/xydl/cac/repository/RemoteDownloadRepository.java +++ b/src/main/java/com/xydl/cac/repository/RemoteDownloadRepository.java @@ -5,8 +5,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface RemoteDownloadRepository extends JpaRepository, JpaSpecificationExecutor { + List findByConfigIdAndRemotePathAndFilename(Integer configId, String remotePath, String filename); } \ No newline at end of file diff --git a/src/main/java/com/xydl/cac/service/RemoteDownloadService.java b/src/main/java/com/xydl/cac/service/RemoteDownloadService.java index f34b99c..29d8735 100644 --- a/src/main/java/com/xydl/cac/service/RemoteDownloadService.java +++ b/src/main/java/com/xydl/cac/service/RemoteDownloadService.java @@ -7,4 +7,7 @@ public interface RemoteDownloadService { Page list(Integer configId, int pageNum, int pageSize) throws Exception; + void add(RemoteDownload item); + + boolean exist(RemoteDownload item); } diff --git a/src/main/java/com/xydl/cac/service/impl/RemoteDownloadServiceImpl.java b/src/main/java/com/xydl/cac/service/impl/RemoteDownloadServiceImpl.java index ee4a106..49187dd 100644 --- a/src/main/java/com/xydl/cac/service/impl/RemoteDownloadServiceImpl.java +++ b/src/main/java/com/xydl/cac/service/impl/RemoteDownloadServiceImpl.java @@ -55,4 +55,21 @@ public class RemoteDownloadServiceImpl implements RemoteDownloadService { } } } + + @Override + public void add(RemoteDownload item) { + item.setId(null); + repository.save(item); + } + + @Override + public boolean exist(RemoteDownload item) { + List list = repository.findByConfigIdAndRemotePathAndFilename(item.getConfigId(), item.getRemotePath(), item.getFilename()); + if (CollectionUtils.isEmpty(list)) { + return false; + } else { + return true; + } + } + } diff --git a/src/main/java/com/xydl/cac/task/SftpDownloadTask.java b/src/main/java/com/xydl/cac/task/SftpDownloadTask.java new file mode 100644 index 0000000..d04a540 --- /dev/null +++ b/src/main/java/com/xydl/cac/task/SftpDownloadTask.java @@ -0,0 +1,119 @@ +package com.xydl.cac.task; + +import com.jcraft.jsch.ChannelSftp; +import com.xydl.cac.entity.*; +import com.xydl.cac.service.RemoteConfigService; +import com.xydl.cac.service.RemoteDownloadService; +import com.xydl.cac.socket.WebSocketServer; +import com.xydl.cac.util.DingTalkPushUtil; +import com.xydl.cac.util.SFTPTool; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.io.File; +import java.util.Date; +import java.util.List; +import java.util.Vector; + +@Service +@Slf4j +public class SftpDownloadTask { + + @Value("${cac.data-path}") + public String dataPath; + + @Resource + RemoteConfigService configService; + @Resource + RemoteDownloadService downloadService; + @Resource + DingTalkPushUtil dingTalkPushUtil; + @Resource + WebSocketServer webSocketServer; + + @Scheduled(cron = "0 3 * * * ?") + public void downloadAll() { + List configList = configService.listAll(); + if (!CollectionUtils.isEmpty(configList)) { + log.info("SftpDownloadTask.downloadAll 开始."); + try { + for (RemoteConfig config : configList) { + this.downloadServer(config); + } + log.info("SftpDownloadTask.downloadAll 结束."); + } catch (Exception e) { + log.error("SftpDownloadTask.downloadAll error.", e); + String str = "SFTP下载文件异常: " + e.getMessage(); + webSocketServer.sendMessage(str); + dingTalkPushUtil.pushText(str); + } + } + } + + // 下载一个远端服务器 + private void downloadServer(RemoteConfig config) throws Exception { + if (config.getActive() == null || config.getActive().intValue() == 0) { + return; + } + config.toList(); + if (config.getPathList() == null) { + return; + } + SFTPTool sftpTool = new SFTPTool(); + try { + sftpTool.connect(config.getIp(), config.getPort(), config.getUser(), config.getPasswd()); + + for (String remotePath : config.getPathList()) { + this.downloadPath(remotePath, config, sftpTool); + } + } catch (Exception e) { + log.error("SftpDownloadTask.downloadServer error.", e); + String str = "SFTP下载文件异常: " + e.getMessage(); + webSocketServer.sendMessage(str); + dingTalkPushUtil.pushText(str); + } finally { + sftpTool.disconnect(); + } + } + + private void downloadPath(String remotePath, RemoteConfig config, SFTPTool sftpTool) throws Exception { + String str = "abcd" + remotePath.replaceAll("/", "").replaceAll("\\\\", ""); + str = str.substring(str.length() - 4); + String localPath = "/ampli/" + config.getIp() + "/" + str; + File dir = new File(dataPath + localPath); + dir.mkdirs(); + + Vector files = sftpTool.listFiles(remotePath); + for (ChannelSftp.LsEntry file : files) { + this.downloadFile(remotePath, file.getFilename(), localPath, config, sftpTool); + } + } + + private void downloadFile(String remotePath, String filename, + String localPath, RemoteConfig config, SFTPTool sftpTool) throws Exception { + if (StringUtils.isBlank(config.getSuffix()) || filename.toLowerCase().endsWith(config.getSuffix().toLowerCase())) { + RemoteDownload item = new RemoteDownload(); + item.setConfigId(config.getId()); + item.setRemotePath(remotePath); + item.setFilename(filename); + + boolean exist = downloadService.exist(item); + if (!exist) { + String localFilePath = localPath + "/" + filename; + sftpTool.download(filename, dataPath + localFilePath); + if (config.getTodel() != null && config.getTodel().intValue() == 1) { + sftpTool.delete(filename); + } + item.setPath("/data" + localFilePath); + item.setCreateTime(new Date()); + downloadService.add(item); + } + } + } + +} diff --git a/src/main/java/com/xydl/cac/util/SFTPTool.java b/src/main/java/com/xydl/cac/util/SFTPTool.java index f131423..ba6ac97 100644 --- a/src/main/java/com/xydl/cac/util/SFTPTool.java +++ b/src/main/java/com/xydl/cac/util/SFTPTool.java @@ -1,15 +1,11 @@ package com.xydl.cac.util; import com.jcraft.jsch.*; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.io.*; import java.util.Properties; import java.util.Vector; -@Component -@Slf4j public class SFTPTool { Session session = null; ChannelSftp sftp = null; @@ -54,19 +50,20 @@ public class SFTPTool { } } - public void upload(String localFilePath, String remoteFilePath) throws Exception { - sftp.put(new FileInputStream(localFilePath), remoteFilePath); + public void upload(String localFilePath, String remoteFileName) throws Exception { + sftp.put(new FileInputStream(localFilePath), remoteFileName); } - public void download(String remoteFilePath, String localFilePath) throws Exception { - sftp.get(remoteFilePath, new FileOutputStream(localFilePath)); + public void download(String remoteFileName, String localFilePath) throws Exception { + sftp.get(remoteFileName, new FileOutputStream(localFilePath)); } - public void delete(String remoteFilePath) throws SftpException { - sftp.rm(remoteFilePath); + public void delete(String remoteFileName) throws SftpException { + sftp.rm(remoteFileName); } public Vector listFiles(String remotePath) throws SftpException { + sftp.cd(remotePath); return sftp.ls(remotePath); } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index f24b498..306dec4 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -9,7 +9,7 @@ spring: time-zone: GMT+8 datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://192.168.1.190:3306/cacdb_panlong?charset=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&connectTimeout=60000&socketTimeout=60000 + url: jdbc:mysql://192.168.1.190:3306/cacdb_fuxian?charset=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&connectTimeout=60000&socketTimeout=60000 username: root password: 123456 jpa: @@ -30,6 +30,7 @@ spring: size: 5 cac: + data-path: /home/xydl/ncac/data i2: enable: false url: http://192.168.1.190:8080/busi-back-ws/service/XydlService diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index befd5dc..fbfe8f7 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -30,6 +30,7 @@ spring: size: 5 cac: + data-path: /home/xydl/ncac/data i2: enable: false url: http://192.168.1.190:8080/busi-back-ws/service/XydlService