package shop.alien.store.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@Configuration
public class ScheduledConfig {

    /**
     * 定时任务调度配置
     *
     * 常用的TaskScheduler配置包括：
     *
     * ThreadPoolTaskScheduler的poolSize属性：用于指定线程池的大小，即同时执行的任务数。
     *
     * ScheduledTaskRegistrar的setScheduler方法：用于设置TaskScheduler实例，以便在应用程序中调度任务。
     *
     * Scheduled注解：用于在方法上标记一个定时任务，并指定任务的执行时间间隔、延迟等属性。
     *
     * Cron表达式：用于指定复杂的任务执行时间表，可以精确到秒级别。
     *
     * TaskExecutor的实现类：用于执行异步任务，可以使用ThreadPoolTaskExecutor等实现类。
     *
     * TaskScheduler的实现类：除了ThreadPoolTaskScheduler，还有其他实现类，如ConcurrentTaskScheduler、TimerTaskScheduler等，可以根据具体需求选择合适的实现类。
     *
     * @return TaskScheduler
     */
    @Bean
    public TaskScheduler taskScheduler() {
        /*
        不显式配置TaskScheduler，Spring会使用默认的TaskScheduler实现类——ScheduledThreadPoolExecutor。
        这个实现类使用一个线程池来执行任务，线程池的大小默认为1。
        也就是说，如果不配置TaskScheduler，所有的定时任务都会在同一个线程中执行，可能会导致任务执行时间过长或者任务之间相互影响。
        因此，为了更好地控制定时任务的执行，建议显式配置TaskScheduler，并根据具体需求设置线程池大小等属性。
        这样可以确保定时任务的精确调度和高效执行。
         */
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(10);
        taskScheduler.initialize();
        return taskScheduler;
    }
}
