package cc.mrbird.febs.server.job.configure;
|
|
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
|
import lombok.RequiredArgsConstructor;
|
import org.quartz.impl.StdSchedulerFactory;
|
import org.quartz.impl.jdbcjobstore.JobStoreTX;
|
import org.quartz.simpl.SimpleThreadPool;
|
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;
|
|
/**
|
* 定时任务配置
|
* http://www.quartz-scheduler.org/documentation/quartz-2.3.0/configuration/
|
*
|
* @author MrBird
|
*/
|
@Configuration
|
@RequiredArgsConstructor
|
public class FebsJobConfigure {
|
|
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();
|
// 设置数据源
|
DataSource job = dynamicRoutingDataSource.getDataSource("job");
|
factory.setDataSource(job);
|
Properties prop = new Properties();
|
// 任务调度实例名称,集群时多个实例名称保持一致
|
prop.put(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME, "FebsCloudScheduler");
|
// 任务调度实例ID,指定为AUTO时,将自动生成ID
|
prop.put(StdSchedulerFactory.PROP_SCHED_INSTANCE_ID, StdSchedulerFactory.AUTO_GENERATE_INSTANCE_ID);
|
// quartz提供的简单线程池,适用于绝大部分场景
|
prop.put(StdSchedulerFactory.PROP_THREAD_POOL_CLASS, SimpleThreadPool.class);
|
// 并发执行任务的线程数,取决于服务器系统资源
|
prop.put("org.quartz.threadPool.threadCount", "20");
|
// 可以是Thread.MIN_PRIORITY(1)和Thread.MAX_PRIORITY(10)之间的任何int值 。
|
// 默认值为Thread.NORM_PRIORITY(5)
|
prop.put("org.quartz.threadPool.threadPriority", "5");
|
// 指定任务存储策略,这里使用关系型数据库
|
prop.put(StdSchedulerFactory.PROP_JOB_STORE_CLASS, JobStoreTX.class);
|
// 是否开启集群
|
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_Cloud_Scheduler");
|
// 延时启动
|
factory.setStartupDelay(1);
|
factory.setApplicationContextSchedulerContextKey("applicationContextKey");
|
// 启动时更新己存在的 Job
|
factory.setOverwriteExistingJobs(true);
|
// 设置自动启动,默认为 true
|
factory.setAutoStartup(true);
|
return factory;
|
}
|
|
}
|