From 471f149a0447a977ba45453195caf5f47c7f1dbe Mon Sep 17 00:00:00 2001 From: lijiahang Date: Fri, 23 Feb 2024 12:04:52 +0800 Subject: [PATCH] =?UTF-8?q?:hammer:=20=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SftpDownloadFlatDirectoryHandler.java | 4 +- ...=> SftpDownloadFlatDirectoryResponse.java} | 6 +-- .../transfer/session/DownloadSession.java | 41 +++++++++++-------- .../host/transfer/session/UploadSession.java | 4 +- .../components/transfer/transfer-drawer.vue | 5 ++- 5 files changed, 35 insertions(+), 25 deletions(-) rename orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/{SftpDownloadDirectoryFlatResponse.java => SftpDownloadFlatDirectoryResponse.java} (72%) diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpDownloadFlatDirectoryHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpDownloadFlatDirectoryHandler.java index b2624387..98a81ef6 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpDownloadFlatDirectoryHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpDownloadFlatDirectoryHandler.java @@ -5,7 +5,7 @@ import com.orion.lang.utils.collect.Lists; import com.orion.ops.framework.common.enums.BooleanBit; import com.orion.ops.module.asset.handler.host.terminal.enums.OutputTypeEnum; import com.orion.ops.module.asset.handler.host.terminal.model.request.SftpDownloadFlatDirectoryRequest; -import com.orion.ops.module.asset.handler.host.terminal.model.response.SftpDownloadDirectoryFlatResponse; +import com.orion.ops.module.asset.handler.host.terminal.model.response.SftpDownloadFlatDirectoryResponse; import com.orion.ops.module.asset.handler.host.terminal.model.response.SftpFileVO; import com.orion.ops.module.asset.handler.host.terminal.session.ISftpSession; import lombok.extern.slf4j.Slf4j; @@ -44,7 +44,7 @@ public class SftpDownloadFlatDirectoryHandler extends AbstractTerminalHandler { + // 异步读取文件内容 + AssetThreadPools.SFTP_DOWNLOAD_SCHEDULER.execute(() -> { + Exception ex = null; try { byte[] buffer = new byte[Const.BUFFER_KB_32]; int len; // 响应文件内容 - while ((len = this.inputStream.read(buffer)) != -1) { + while (this.inputStream != null && (len = this.inputStream.read(buffer)) != -1) { this.channel.sendMessage(new BinaryMessage(buffer, 0, len, true)); } - // 响应结果 - TransferUtils.sendMessage(this.channel, TransferReceiverType.DOWNLOAD_FINISH, null); + log.info("DownloadSession.startDownload finish"); } catch (Exception e) { - log.error("DownloadSession.transfer error", e); - // 响应结果 - TransferUtils.sendMessage(this.channel, TransferReceiverType.DOWNLOAD_ERROR, e); - } finally { - this.closeStream(); + log.error("DownloadSession.startDownload error", e); + ex = e; + } + // 关闭等待 jsch 内部处理 + Threads.sleep(100); + this.closeStream(); + Threads.sleep(100); + // 响应结果 + if (ex == null) { + TransferUtils.sendMessage(this.channel, TransferReceiverType.DOWNLOAD_FINISH, null); + } else { + TransferUtils.sendMessage(this.channel, TransferReceiverType.DOWNLOAD_ERROR, ex); } }); } @@ -73,23 +81,22 @@ public class DownloadSession extends TransferHostSession implements IDownloadSes public void abortDownload() { log.info("DownloadSession.abortDownload"); // 关闭流 - Streams.close(inputStream); - // 响应结果 - TransferUtils.sendMessage(this.channel, TransferReceiverType.DOWNLOAD_FINISH, null); + this.closeStream(); } @Override public void close() { - super.close(); this.closeStream(); + super.close(); } /** * 关闭流 */ private void closeStream() { - // 关闭流 - Streams.close(inputStream); + // 关闭 inputStream 会被阻塞 ??..?? 只能关闭 executor + Streams.close(this.executor); + this.executor = null; this.inputStream = null; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/UploadSession.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/UploadSession.java index 975266f2..893e000d 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/UploadSession.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/UploadSession.java @@ -69,6 +69,7 @@ public class UploadSession extends TransferHostSession implements IUploadSession @Override public void uploadFinish() { + log.info("UploadSession.uploadFinish"); this.closeStream(); // 响应结果 TransferUtils.sendMessage(this.channel, TransferReceiverType.UPLOAD_FINISH, null); @@ -76,6 +77,7 @@ public class UploadSession extends TransferHostSession implements IUploadSession @Override public void uploadError() { + log.error("UploadSession.uploadError"); this.closeStream(); // 响应结果 TransferUtils.sendMessage(this.channel, TransferReceiverType.UPLOAD_ERROR, new InvalidArgumentException((String) null)); @@ -83,8 +85,8 @@ public class UploadSession extends TransferHostSession implements IUploadSession @Override public void close() { - super.close(); this.closeStream(); + super.close(); } /** diff --git a/orion-ops-ui/src/views/host/terminal/components/transfer/transfer-drawer.vue b/orion-ops-ui/src/views/host/terminal/components/transfer/transfer-drawer.vue index ef605323..a0e26573 100644 --- a/orion-ops-ui/src/views/host/terminal/components/transfer/transfer-drawer.vue +++ b/orion-ops-ui/src/views/host/terminal/components/transfer/transfer-drawer.vue @@ -23,7 +23,8 @@
- + +
@@ -116,7 +117,7 @@ import useVisible from '@/hooks/visible'; import { useTerminalStore } from '@/store'; import { getFileSize } from '@/utils/file'; - import { TransferStatus } from '../../types/terminal.const'; + import { TransferStatus, TransferType } from '../../types/terminal.const'; const { transferManager } = useTerminalStore(); const { visible, setVisible } = useVisible();