1. 程式人生 > >SpringBoot+Quartz 實現任務排程實戰

SpringBoot+Quartz 實現任務排程實戰

    話不多說,貼程式碼

要執行的任務:

@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;

    }

控制檯資訊:


可以實現多工,多觸發執行。但是第一個框還是沒搞明白什麼意思,是不是正常的意思,還是還有錯誤。望大佬指點