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();