springboot 整合quartz 建立多個定時任務
阿新 • • 發佈:2019-01-29
1.pom.xml
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring-context-version}</version> </dependency> <spring-context-version>4.0.6.RELEASE</spring-context-version> <quartz-version>2.2.1</quartz-version>
2. QuartzConfiguration
import com.ppdai.baihang.job.FirstJob; import com.ppdai.baihang.job.SecondJob; import com.ppdai.baihang.utils.SpringUtil; import org.quartz.JobDetail; import org.quartz.Trigger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.quartz.CronTriggerFactoryBean; import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean; @Configuration public class QuartzConfiguration { // 配置觸發器1 @Bean(name = "firstTrigger") public SimpleTriggerFactoryBean firstTrigger(JobDetail firstJobDetail) { SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean(); trigger.setJobDetail(firstJobDetail); // 設定任務啟動延遲 trigger.setStartDelay(0); // 每5秒執行一次 trigger.setRepeatInterval(5000); return trigger; } // 配置定時任務1 @Bean(name = "firstJobDetail") public MethodInvokingJobDetailFactoryBean firstJobDetail() { FirstJob firstJob = (FirstJob) SpringUtil.getBean(FirstJob.class); MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean(); // 是否併發執行 jobDetail.setConcurrent(false); // 為需要執行的實體類對應的物件 jobDetail.setTargetObject(firstJob); // 需要執行的方法 jobDetail.setTargetMethod("task"); return jobDetail; } // 配置觸發器2 @Bean(name = "secondTrigger") public CronTriggerFactoryBean secondTrigger(JobDetail secondJobDetail) { CronTriggerFactoryBean trigger = new CronTriggerFactoryBean(); trigger.setJobDetail(secondJobDetail); // cron表示式 trigger.setCronExpression("*/5 * * * * ?"); return trigger; } // 配置定時任務2 @Bean(name = "secondJobDetail") public MethodInvokingJobDetailFactoryBean secondJobDetail() { SecondJob secondJob = (SecondJob) SpringUtil.getBean(SecondJob.class); MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean(); // 是否併發執行 jobDetail.setConcurrent(false); // 為需要執行的實體類對應的物件 jobDetail.setTargetObject(secondJob); // 需要執行的方法 jobDetail.setTargetMethod("task"); return jobDetail; } // 配置Scheduler @Bean(name = "scheduler") public SchedulerFactoryBean schedulerFactory(Trigger firstTrigger, Trigger secondTrigger) { SchedulerFactoryBean bean = new SchedulerFactoryBean(); // 延時啟動,應用啟動1秒後 bean.setStartupDelay(1); // 註冊觸發器 bean.setTriggers(firstTrigger, secondTrigger); return bean; } }
3.FirstJob
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;
@EnableScheduling
@Component
public class FirstJob{
public void task(){
System.out.println("任務1執行....");
}
}
4.SecondJob
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.Component; @EnableScheduling @Component public class SecondJob{ public void task(){ System.out.println("任務2執行...."); } }
5.由於QuartzConfiguration中使用@Configuratios註解 故不能使用註解的方式注入bean, 寫個util從ApplicationContext中獲取
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringUtil.applicationContext == null) {
SpringUtil.applicationContext = applicationContext;
}
}
//獲取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通過name獲取 Bean.
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
//通過class獲取Bean.
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
//通過name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}