package com.kym.miniapp.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

/**
 * 异步线程池配置类
 * 使用 Java 21 虚拟线程优化调度任务
 *
 * @author skyline
 * @date 2023-08-29 14:11
 */
@Configuration
@Slf4j
public class ThreadPoolTaskExecutorConfig {
    
    /**
     * 使用虚拟线程的调度器（推荐）
     * 注意：ScheduledExecutorService 暂不支持虚拟线程
     * 我们使用虚拟线程执行器来运行任务
     */
    @Bean
    public TaskScheduler syncScheduler() {
        log.info("初始化调度虚拟线程执行器 - 使用 Java 21 Virtual Threads");
        
        // 使用传统的 ScheduledExecutorService 作为调度器，但使用较小的线程数
        // 实际的任务执行会在虚拟线程中进行
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(2); // 减少调度线程数，因为任务会在虚拟线程中执行
        scheduler.setThreadGroupName("syncTg-vt");
        scheduler.setThreadNamePrefix("syncThread-vt-");
        scheduler.initialize();
        return scheduler;
    }
    
    /**
     * 传统线程池调度器（作为备用方案保留）
     * 如需切换回传统线程池，请将上面的 @Bean 注解注释，并启用此方法
     */
    // @Bean
    public TaskScheduler traditionalSyncScheduler() {
        log.info("初始化传统线程池调度器");
        ThreadPoolTaskScheduler syncScheduler = new ThreadPoolTaskScheduler();
        syncScheduler.setPoolSize(10);
        // 这里给线程设置名字，主要是为了在项目能够更快速的定位错误。
        syncScheduler.setThreadGroupName("syncTg");
        syncScheduler.setThreadNamePrefix("syncThread-");
        syncScheduler.initialize();
        return syncScheduler;
    }
}