package com.qqchen.deploy.backend.framework.ssh.websocket;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.core.task.SimpleAsyncTaskExecutor;

/**
 * SSH WebSocket框架配置（Framework层）
 * 
 * 职责：
 * 1. 提供SSH输出监听专用的虚拟线程池
 * 2. 框架内部使用，业务层无需关心
 * 
 * @author Framework
 */
@Configuration
public class SSHWebSocketConfig {
    
    /**
     * SSH输出监听专用线程池（虚拟线程）
     * 
     * ⚠️ 为什么使用虚拟线程？
     * 1. SSH输出监听是典型的**阻塞I/O密集型**任务
     * 2. 每个SSH连接需要2个长期阻塞的线程（stdout + stderr）
     * 3. 虚拟线程几乎无资源开销，支持数百万并发
     * 4. 完美适配大量SSH长连接场景
     * 
     * 📊 性能对比：
     * - 平台线程：50个SSH连接 = 100个线程 ≈ 100-200MB内存 ❌
     * - 虚拟线程：50个SSH连接 = 100个虚拟线程 ≈ 几MB内存 ✅
     */
    @Bean("sshOutputExecutor")
    public AsyncTaskExecutor sshOutputExecutor() {
        SimpleAsyncTaskExecutor executor = 
            new SimpleAsyncTaskExecutor("ssh-virtual-");
        
        // 启用虚拟线程（Java 21+）
        executor.setVirtualThreads(true);
        
        // 并发限制：-1表示无限制（虚拟线程资源消耗极低）
        executor.setConcurrencyLimit(-1);
        
        return executor;
    }
    
    /**
     * 文件上传专用线程池（虚拟线程）
     * 
     * ⚠️ 为什么使用虚拟线程？
     * 1. 文件上传是典型的**I/O密集型**任务（网络传输、磁盘读取）
     * 2. 大文件上传时线程主要在等待I/O完成
     * 3. 虚拟线程在阻塞时自动释放底层平台线程
     * 4. 支持大量并发上传而不消耗过多资源
     * 
     * 📊 性能对比：
     * - 平台线程：100个并发上传 = 100个线程 ≈ 100-200MB内存 + CPU调度开销 ❌
     * - 虚拟线程：100个并发上传 = 100个虚拟线程 ≈ 几MB内存 + 零调度开销 ✅
     * 
     * 💡 使用场景：
     * - 异步文件上传
     * - 文件传输监控
     * - 进度追踪任务
     */
    @Bean("fileUploadExecutor")
    public AsyncTaskExecutor fileUploadExecutor() {
        SimpleAsyncTaskExecutor executor = 
            new SimpleAsyncTaskExecutor("file-upload-");
        
        // 启用虚拟线程（Java 21+）
        executor.setVirtualThreads(true);
        
        // 并发限制：-1表示无限制（虚拟线程适合I/O密集型任务）
        executor.setConcurrencyLimit(-1);
        
        return executor;
    }
}
