package cc.mrbird.febs.job.configure; import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import javax.sql.DataSource; import java.util.Properties; import java.util.concurrent.ThreadPoolExecutor; /** * 定时任务配置 * * @author MrBird */ @Configuration @RequiredArgsConstructor public class ScheduleConfigure { private final DynamicRoutingDataSource dynamicRoutingDataSource; @Bean public ThreadPoolTaskExecutor scheduleJobExecutorService(){ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(10); executor.setQueueCapacity(20); executor.setKeepAliveSeconds(30); executor.setThreadNamePrefix("Febs-Job-Thread"); executor.setWaitForTasksToCompleteOnShutdown(true); executor.setAwaitTerminationSeconds(60); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean factory = new SchedulerFactoryBean(); // 手动从多数据源中获取 quartz数据源 DataSource quartz = dynamicRoutingDataSource.getDataSource("quartz"); factory.setDataSource(quartz); // quartz参数 Properties prop = new Properties(); prop.put("org.quartz.scheduler.instanceName", "MyScheduler"); prop.put("org.quartz.scheduler.instanceId", "AUTO"); // 线程池配置 prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); prop.put("org.quartz.threadPool.threadCount", "20"); prop.put("org.quartz.threadPool.threadPriority", "5"); // JobStore配置 prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); // 集群配置 prop.put("org.quartz.jobStore.isClustered", "true"); prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000"); prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1"); prop.put("org.quartz.jobStore.misfireThreshold", "12000"); prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); factory.setQuartzProperties(prop); factory.setSchedulerName("FEBS_Scheduler"); // 延时启动 factory.setStartupDelay(1); factory.setApplicationContextSchedulerContextKey("applicationContextKey"); // 启动时更新己存在的 Job factory.setOverwriteExistingJobs(true); // 设置自动启动,默认为 true factory.setAutoStartup(true); return factory; } }