Quartz定時任務的使用和配置,全注解和xml


簡介

Quartz是Job scheduling(作業調度)領域的一個開源項目,Quartz既可以單獨使用也可以跟spring框架整合使用,在實際開發中一般會使用后者。使用Quartz可以開發一個或者多個定時任務,每個定時任務可以單獨指定執行的時間,例如每隔1小時執行一次、每個月第一天上午10點執行一次、每個月最后一天下午5點執行一次等。

官網:http://www.quartz-scheduler.org/

maven坐標:

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.2.1</version>
</dependency>
<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz-jobs</artifactId>
  <version>2.2.1</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.0.5.RELEASE</version>
</dependency>

xml配置

創建一個工作類

public class ClearImageJob {
    /**
     * 定義清理圖片的任務
     */    
    public void clearImageJob(){
        System.out.println("clearImageJob......");
    }
}

主要配置的內容有

配置自定義Job、任務描述、觸發器、調度工廠等

  • 自動掃包

  • 注冊任務對象

  • 注冊JobDetail

  • 觸發器

  • 調度工廠

<!--自動掃包,后續注入jedis到任務調度類-->
<context:component-scan base-package="com.itheima.health"/>
<!--注冊一個定義任務對象-->
<bean id = "clearImgJob" class="com.itheima.health.jobs.ClearImageJob"/>
<!-- 注冊JobDetail,作用是負責通過反射調用指定的Job -->
<bean id="clearImgJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <!--注入對象-->
    <property name="targetObject" ref="clearImgJob"/>
    <!--注入方法-->
    <property name="targetMethod" value="clearImageJob"/>
</bean>
<!--注冊一個觸發器,指定任務觸發的時間(間隔)-->
<bean id="jobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail" ref="clearImgJobDetail"/>
    <property name="cronExpression">
        <!-- 每隔10秒執行一次任務 0/10 * * * * ? -->
        <!-- 每隔2分鍾執行一次任務  0 0/2 * * * ? -->
        <!-- 每天凌晨2點執行一次任務 0 0 2 * * ?  -->
        <value>0/10 * * * * ?</value>
    </property>
</bean>
<!--注冊一個統一調用工廠,通過這個調度工廠調度任務-->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="jobTrigger"/>
        </list>
    </property>
</bean>

全注解(1)對應xml配置寫一一注入就ok

工作類

public class ClearImageJob {
    /**
     * 定義清理圖片的任務
     */
    public void clearImagesJob(){
        System.out.println("clearImageJob......");
    }
}
@Configuration
public class QuartzConfig {
    //<!--注冊一個定義任務對象-->
    @Bean
    public ClearImageJob clearImageJob() {
        ClearImageJob clearImageJob = new ClearImageJob();
        return clearImageJob;
    }

    //<!-- 注冊JobDetail,作用是負責通過反射調用指定的Job -->
    @Bean
    public MethodInvokingJobDetailFactoryBean clearImgJobDetail(ClearImageJob clearImageJob) {
        MethodInvokingJobDetailFactoryBean clearImgJobDetail = new MethodInvokingJobDetailFactoryBean();
        clearImgJobDetail.setTargetObject(clearImageJob);
        clearImgJobDetail.setTargetMethod("clearImagesJob");
        return clearImgJobDetail;
    }

    @Bean
    public CronTriggerFactoryBean cronTriggerFactoryBean(MethodInvokingJobDetailFactoryBean clearImgJobDetail) {
        CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
        cronTriggerFactoryBean.setJobDetail(clearImgJobDetail.getObject());
//             <!-- 每隔10秒執行一次任務 0/10 * * * * ? -->
//            <!-- 每隔2分鍾執行一次任務  0 0/2 * * * ? -->
//            <!-- 每天凌晨2點執行一次任務 0 0 2 * * ?  -->
//            <value>0/10 * * * * ?</value>
        cronTriggerFactoryBean.setCronExpression("0/10 * * * * ?");
        return cronTriggerFactoryBean;
    }

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean){
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setTriggers(cronTriggerFactoryBean.getObject());
        return schedulerFactoryBean;
    }
}

按照xml順序配置下來測試沒問題。

全注解配置(2),推薦用法,非常簡潔

首先有一個配置類

@Configuration
@EnableScheduling
@ComponentScan("cn.zys.quartzs")
public class TestQAnnoConfig {
}
@EnableScheduling 開啟定時任務功能
然后掃描定時任務所在包

使用定時任務

@Component
public class TestQAnno {

    //    @Scheduled(cron = "*/5 * * * * SUN-MON")
    @Scheduled(cron = "0/10 * * * * ?")
    public void test() {
        System.out.println("計時任務....");
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM