Quartz快速入門

Quartz是一個定時任務調度的框架,在預約的時間到達時,執行某一任務spring

可認爲是JDK的Timer類的擴展app

Quartz的核心接口
Scheduler – 核心調度器
Job – 任務
JobDetail – 任務描述
Trigger  -- 觸發器
    SimpleTrigger只執行一次或在給定時間觸發並重復N次
    CronTriggers:像日曆那樣按日程來觸發任務, 使用cron表達式框架

 

代碼示例ide

public class MyJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Hello world");
    }
}
public class QuartzExample {

    public void run() throws Exception {
        // 調度器
        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();

        // 獲取當前時間的下一分鐘
        Date runTime = evenMinuteDate(new Date());

        // 定義job
        // 在quartz中,有組的概念,withIdentity(名稱, 組)
        JobDetail job = newJob(MyJob.class).withIdentity("job1", "group1").build();

        // 定義觸發器,每2秒執行一次
        Trigger trigger = newTrigger().withIdentity("trigger1", "group1").withSchedule(cronSchedule("0 0/1 * * * ?")).build();
        // 定義觸發器,在下一分鐘啓動
        // Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
        
        // 將job註冊到調度器
        sched.scheduleJob(job, trigger);
        // 啓動調度器
        sched.start();

        // 模擬handling
        Thread.sleep(60L * 1000L);
      
        // 關閉調度器
        sched.shutdown(true);
    }

    public static void main(String[] args) throws Exception {
        QuartzExample example = new QuartzExample();
        example.run();
    }
}

 

進一步的用法是與Spring整合ui

public class MyJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("myJob 執行了............." + context.getTrigger().getKey().getName());
        // get("applicationContext")參數是spring配置中applicationContextJobDataKey屬性的值, 做爲jobmap的key. 這條語句拿到spring容器
        ApplicationContext applicationContext = (ApplicationContext) context.getJobDetail().getJobDataMap().get("applicationContext");
        System.out.println("獲取到的Spring容器是: " + applicationContext);
    }
}
// 實例化spring容器
public
class Main { public static void main(String[] args) { new ClassPathXmlApplicationContext("classpath:applicationContext-scheduler.xml"); } }

spring配置文件spa

<!-- 定義jobDetail -->
    <bean id ="myJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <!-- 指定具體的job類 -->
        <property name ="jobClass" value="com.zx.quartz.MyJob" />
        <!-- 指定job的名稱 -->
        <property name="name" value="myJob" />
        <!-- 指定job的分組 -->
        <property name="group" value="jobs" />
        <!-- 必須設置爲true,若是爲false,當沒有活動的觸發器與之關聯時會在調度器中刪除該任務  -->
        <property name="durability" value="true"/>
        <!-- 指定spring容器的key,若是不設定那麼在job類中是獲取不到spring容器裏的對象的  -->
        <property name="applicationContextJobDataKey" value="applicationContext"/>
    </bean>
    
    <!-- 另外一種方式, 定義job和jobDetial, Job類爲普通類便可
        <!-- 配置job --
        <bean id="myJob" class="com.zx.quartz.MyJob"/>
        <!-- 配置jobDetail --
        <bean id="myJobDetial" class="org.springframework.scheduling.quartz.MethodlnvokingJobDetaiLFactoryBean">
            <property name="targetObject">
                <ref bean="myJob" />
            </property>
            <property name="targetMethod">  <!-- 要執行的方法名 --
                <value>execute</value>
            </property>
        </bean>
     -->
    
    <!-- 定義觸發器 -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="myJobDetail" />
        <!-- 每五秒執行一次 -->
        <property name="cronExpression" value="0/5 * * * * ?" />
    </bean>
    
    <!-- 定義觸發器, 一個job能夠有多個trigger, 但一個trigger只能有一個job -->
    <bean id="cronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="myJobDetail" />
        <!--  每一分鐘執行一次 -->
        <property name="cronExpression" value="0 */1 * * * ?" />
    </bean>
    
    <!-- 定義調度器 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTrigger" />
                <ref bean="cronTrigger2" />
            </list>
        </property>
    </bean>
相關文章
相關標籤/搜索