quartz+springboot使用

配置類

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異常");
          }
      }
    }


}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章