配置類
job:
executor:
thread:
core_pool_size: 5
# 最大線程數
max_pool_size: 8
# 任務隊列大小
queue_capacity: 2
# 緩衝隊列中線程的空閒時
keep_alive_seconds: 100
# 線程池中線程的名稱前綴
name:
prefix: quartz-service-
//配置線程池
@Configuration
public class JobExecutorConfig {
@Value("${job.executor.thread.core_pool_size}")
private int corePoolSize;
@Value("${job.executor.thread.max_pool_size}")
private int maxPoolSize;
@Value("${job.executor.thread.queue_capacity}")
private int queueCapacity;
@Value("${job.executor.thread.name.prefix}")
private String namePrefix;
@Value("${job.executor.thread.keep_alive_seconds}")
private int keepAliveSeconds;
@Bean(name = "asyncTaskExecutor")
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 核心線程數
executor.setCorePoolSize(corePoolSize);
// 最大線程數
executor.setMaxPoolSize(maxPoolSize);
// 任務隊列大小
executor.setQueueCapacity(queueCapacity);
// 線程前綴名
executor.setThreadNamePrefix(namePrefix);
// 線程的空閒時間
executor.setKeepAliveSeconds(keepAliveSeconds);
// 拒絕策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 線程初始化
executor.initialize();
return executor;
}
}
//實現對job中bean的識別
@Component
public class JobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
@Configuration
public class SchedulerConfig {
@Autowired
private JobFactory jobFactory;
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setJobFactory(jobFactory);
return schedulerFactoryBean;
}
@Bean
public Scheduler scheduler() {
return schedulerFactoryBean().getScheduler();
}
}
調度類
FetchTask需繼承Job類
實現execute方法
/**
* 定時器任務調度
* @param ip
* @param username
* @param password
* @throws SchedulerException
*/
public void startSchedule(String ip,String username,String password) throws SchedulerException{
JobDetail jobDetail = JobBuilder.newJob(QuartZTest.class)
.usingJobData("ip", ip)
.usingJobData("username",username)
.usingJobData("password",password)
.withIdentity("job"+username, ip).build();
// 3、構建Trigger實例,每隔1min執行一次
Date startDate = new Date();
startDate.setTime(startDate.getTime() + 5000);
Trigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger"+username,ip)
.startNow()//立即生效
.startAt(startDate)
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInMinutes(1)
.repeatForever())
.build();
scheduler.scheduleJob(jobDetail, cronTrigger);
scheduler.start();
}
/**
* 啓動定時器
*/
@PostConstruct
public void init() {
List<Info> infos=opsInfo.getInfo();
for (int i=0;i<infos.size();i++){
Info info=infos.get(i);
String ip=info.getIp();
String username=info.getUsername();
String password=info.getPassword();
try {
startSchedule(ip,username,password);
} catch (SchedulerException e) {
log.error("schedule異常:{}",e.getMessage());
throw new BusinessException("發生schedule異常");
}
}
}
}