SpringBoot+Quartz 實現任務排程實戰
阿新 • • 發佈:2019-02-14
話不多說,貼程式碼
要執行的任務:
@Component
public class Job {
static int count1=0;
public void todo(){
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
count1++;
System.out.println("計劃任務1執行了"+count1+"次!!!"+time);
}
配置類:
@Configuration public class Config { @Bean public MethodInvokingJobDetailFactoryBean quartzDetail(Job job){ MethodInvokingJobDetailFactoryBean quartzDetail = new MethodInvokingJobDetailFactoryBean(); quartzDetail.setTargetObject(job); quartzDetail.setTargetMethod("todo"); quartzDetail.setConcurrent(false); return quartzDetail; } @Bean public CronTriggerFactoryBean cronTrigger(MethodInvokingJobDetailFactoryBean quartzDetail){ CronTriggerFactoryBean cronTrigger = new CronTriggerFactoryBean(); cronTrigger.setJobDetail(quartzDetail.getObject()); cronTrigger.setCronExpression("0/10 * * * * ? "); return cronTrigger; } @Bean public SchedulerFactoryBean schedulerFactoryBean(Trigger cronTrigger){ SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setTriggers(cronTrigger); return schedulerFactoryBean; } ////////////////////////////////////////////////////////////////////////
啟動類:
@SpringBootApplication
public class Demo2Application {
public static void main(String[] args) {
SpringApplication.run(Demo2Application.class, args);
}
}
這個定時任務是公司前輩寫的,也完全可以跑,可以實現功能,但是最近公司又加一個定時任務,就是有兩個job,這就難了,對我這種剛接觸quartz框架的人來說,一頭霧水。我也到網上看過相關教程,都不是用的這種方法。
我嘗試過再寫一個配置類和再寫一個job。但是注入失敗了。
後來才明白是註解的原因:
@Configuration可理解為用spring的時候xml裡面的<beans>標籤
@Bean可理解為用spring的時候xml裡面的<bean>標籤
但是這都不是最重要的,並沒有標明bean的標誌,就是有兩個bean沒有辦法區分。後來發現了註解
@Qualifier qualifier的意思是合格者,通過這個標示,表明了哪個實現類才是我們所需要的,我們修改呼叫程式碼,新增@Qualifier註解,需要注意的是@Qualifier的引數名稱必須為我們之前定義@Bean註解的名稱之一!而@Bean註解如果不寫名稱就會預設是方法名第一個字母小寫。
修改後的程式碼:
要執行的任務:
@Component
public class Job {
static int count1=0;
public void todo(){
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
count1++;
System.out.println("計劃任務1執行了"+count1+"次!!!"+time);
}
static int count2=0;
public void todo2(){
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
count2++;
System.out.println("計劃任務2執行了"+count2+"次!!!"+time);
}
配置類:
@Configuration
public class Config {
@Bean
public MethodInvokingJobDetailFactoryBean quartzDetail(Job job) {
MethodInvokingJobDetailFactoryBean quartzDetail = new MethodInvokingJobDetailFactoryBean();
quartzDetail.setTargetObject(job);
quartzDetail.setTargetMethod("todo");
quartzDetail.setConcurrent(false);
return quartzDetail;
}
@Bean
public CronTriggerFactoryBean cronTrigger(@Qualifier("quartzDetail") MethodInvokingJobDetailFactoryBean quartzDetail) {
CronTriggerFactoryBean cronTrigger = new CronTriggerFactoryBean();
cronTrigger.setJobDetail(quartzDetail.getObject());
cronTrigger.setCronExpression("0/10 * * * * ? ");
return cronTrigger;
}
////////////////////////////////////////////////////////////////////////
@Bean
public MethodInvokingJobDetailFactoryBean quartzDetail2(Job job) {
MethodInvokingJobDetailFactoryBean quartzDetail = new MethodInvokingJobDetailFactoryBean();
quartzDetail.setTargetObject(job);
quartzDetail.setTargetMethod("todo2");
quartzDetail.setConcurrent(false);
return quartzDetail;
}
@Bean
public CronTriggerFactoryBean cronTrigger2(@Qualifier("quartzDetail2") MethodInvokingJobDetailFactoryBean quartzDetail2) {
CronTriggerFactoryBean cronTrigger = new CronTriggerFactoryBean();
cronTrigger.setJobDetail(quartzDetail2.getObject());
cronTrigger.setCronExpression("0/5 * * * * ? ");
return cronTrigger;
}
////////////////////////////////////////////////////
@Bean
public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("cronTrigger") Trigger cronTrigger, @Qualifier("cronTrigger2") Trigger cronTrigger2) {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setTriggers(cronTrigger, cronTrigger2);
return schedulerFactoryBean;
}
控制檯資訊:
可以實現多工,多觸發執行。但是第一個框還是沒搞明白什麼意思,是不是正常的意思,還是還有錯誤。望大佬指點