package com.ycwl.basic.integration.kafka.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 人脸识别异步处理线程池配置
 */
@Slf4j
@Configuration
@ConditionalOnProperty(name = "kafka.enabled", havingValue = "true")
public class FaceRecognitionThreadPoolConfig {

    /**
     * 创建人脸识别专用线程池
     * - 核心线程数：32
     * - 最大线程数：128
     * - 队列容量：1000（避免无限制增长）
     * - 拒绝策略：CallerRunsPolicy（调用者线程执行）
     */
    @Bean(name = "faceRecognitionExecutor", destroyMethod = "shutdown")
    public ThreadPoolExecutor faceRecognitionExecutor() {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
            32,                                      // 核心线程数
            128,                                     // 最大线程数
            60L,                                     // 空闲线程存活时间
            TimeUnit.SECONDS,                        // 时间单位
            new LinkedBlockingQueue<>(1000),         // 任务队列
            r -> {
                Thread thread = new Thread(r);
                thread.setName("face-recognition-" + thread.getId());
                thread.setDaemon(false);
                return thread;
            },
            new ThreadPoolExecutor.CallerRunsPolicy() // 超过容量时由调用者线程执行
        );

        log.info("人脸识别线程池初始化完成 - 核心线程数: {}, 最大线程数: {}, 队列容量: 1000",
                executor.getCorePoolSize(), executor.getMaximumPoolSize());

        return executor;
    }
}
