亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

慕課網(wǎng)_《Java定時(shí)任務(wù)調(diào)度工具詳解之Quartz篇》學(xué)習(xí)總結(jié)

hiYoHoo / 3407人閱讀

摘要:時(shí)間年月日星期一說明本文部分內(nèi)容均來自慕課網(wǎng)。屬性任務(wù)名稱任務(wù)所屬組任務(wù)實(shí)現(xiàn)類傳參的作用淺談上是什么當(dāng)調(diào)用一個(gè),就會(huì)將傳遞給的方法能通過對(duì)象訪問到運(yùn)行時(shí)候的環(huán)境以及本身的明細(xì)數(shù)據(jù)。

時(shí)間:2017年06月26日星期一
說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com
教學(xué)示例源碼:https://github.com/zccodere/s...
個(gè)人學(xué)習(xí)源碼:https://github.com/zccodere/s...

第一章:課程介紹 1-1 初識(shí)Quartz

Quartz概要

OpenSymphony提供的強(qiáng)大的開源任務(wù)調(diào)度框架
官網(wǎng):http://www.quartz-scheduler.org
純Java實(shí)現(xiàn),精細(xì)控制排程

Quartz特點(diǎn)

強(qiáng)大的調(diào)度功能
靈活的應(yīng)用方式
分布式和集群能力

Quartz的設(shè)計(jì)模式

Builder模式
Factory模式
組件模式
鏈?zhǔn)綄懛?/pre>

Quartz三個(gè)核心概念

調(diào)度器
任務(wù)
觸發(fā)器

Quartz體系結(jié)構(gòu)

JobDetail
trigger
    SimpleTrigger
    CronTrigger
scheduler
    start
    stop
    pause
    resume

示意圖

Quartz重要組成

Job
JobDetail
JobBuilder
JobStore
Trigger
TriggerBuilder
ThreadPool
Scheduler
Calendar:一個(gè)Trigger可以和多個(gè)Calendar關(guān)聯(lián),以排除或包含某些時(shí)間點(diǎn)
監(jiān)聽器
    JobListener
    TriggerListener
    SchedulerListener
第二章:Quartz詳解 2-1 第一個(gè)Quartz程序

準(zhǔn)備工作

建立Maven項(xiàng)目工程
引入Quartz包

編寫第一個(gè)Quartz任務(wù)

讓任務(wù)每隔兩秒打印一次hellworld

代碼演示

1.編寫任務(wù)類

package com.myimooc.helloquartz.one;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * 編寫 自定義任務(wù)
 * @author ZhangCheng on 2017-06-26
 *
 */
public class HelloJob implements Job{
    
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Exec Time Is : " + sf.format(date));
        
        // 編寫具體的業(yè)務(wù)邏輯
        System.out.println("Hello World!");
    }
    
}

2.編寫任務(wù)調(diào)度類

package com.myimooc.helloquartz.one;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
 * 編寫 任務(wù)調(diào)度類
 * @author ZhangCheng on 2017-06-26
 *
 */
public class HelloScheduler {
    
    public static void main(String[] args) throws SchedulerException {
        
        // 創(chuàng)建一個(gè) JobDetail 實(shí)例,將該實(shí)例與 HelloJob 實(shí)例綁定
        JobDetail jobDeatil = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myjob", "jobgroup1")// 定義標(biāo)識(shí)符
                .build();
        
        System.out.println("jobDetail"s name : " + jobDeatil.getKey().getName());
        System.out.println("jobDetail"s group : " + jobDeatil.getKey().getGroup());
        System.out.println("jobDetail"s jobClass : " + jobDeatil.getJobClass().getName());
        
        // 創(chuàng)建一個(gè) Trigger 實(shí)例,定義該 job 立即執(zhí)行,并且每隔兩秒重復(fù)執(zhí)行一次,直到永遠(yuǎn)
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("myTrigger","trigroup1")// 定義標(biāo)識(shí)符
                .startNow()// 定義立即執(zhí)行
                .withSchedule(SimpleScheduleBuilder
                        .simpleSchedule()
                        .withIntervalInSeconds(2)
                        .repeatForever())// 定義執(zhí)行頻度
                .build();
        
        // 創(chuàng)建 Scheduler 實(shí)例
        SchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        
        // 綁定 JobDetail 和 trigger
        scheduler.scheduleJob(jobDeatil, trigger);
        
        // 執(zhí)行任務(wù)
        scheduler.start();
        
        // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Time Is : " + sf.format(date));
    }
    
}
2-2 淺談Job&JobDetail

Job定義

實(shí)現(xiàn)業(yè)務(wù)邏輯的任務(wù)接口

淺談Job

Job接口非常容易實(shí)現(xiàn),只有一個(gè)execute方法,類似TimerTask的run方法,在里面編寫業(yè)務(wù)邏輯
Job接口源碼
public interface Job {
    void execute(JobExecutionContext context) throws JobExecutionException;
}

Job實(shí)例在Quartz中的生命周期

每次調(diào)度器執(zhí)行job時(shí),它在調(diào)用execute方法前會(huì)創(chuàng)建一個(gè)新的job實(shí)例
當(dāng)調(diào)用完成后,關(guān)聯(lián)的job對(duì)象實(shí)例會(huì)被釋放,釋放的實(shí)例會(huì)被垃圾回收機(jī)制回收

淺談JobDetail

JobDetail為Job實(shí)例提供了許多設(shè)置屬性,以及JobDetailMap成員變量屬性,它用來存儲(chǔ)特定Job實(shí)例的狀態(tài)信息,調(diào)度器需要借助JobDetail對(duì)象來添加Job實(shí)例。

JobDetail屬性

name:任務(wù)名稱
group:任務(wù)所屬組
jobClass:任務(wù)實(shí)現(xiàn)類
jobDataMap:傳參的作用
2-3 淺談JobExecutionContext&JobDataMap(上)

JobExecutionContext是什么

當(dāng)Scheduler調(diào)用一個(gè)Job,就會(huì)將JobExecutionContext傳遞給Job的execute()方法;
Job能通過JobExecutionContext對(duì)象訪問到Quartz運(yùn)行時(shí)候的環(huán)境以及Job本身的明細(xì)數(shù)據(jù)。

JobDataMap是什么

在進(jìn)行任務(wù)調(diào)度時(shí)JobDataMap存儲(chǔ)在JobExecutionContext中,非常方便獲取
JobDataMap可以用來裝載任務(wù)可序列化的數(shù)據(jù)對(duì)象,當(dāng)job實(shí)例對(duì)象被執(zhí)行時(shí)這些參數(shù)對(duì)象會(huì)傳遞給它
JobDataMap實(shí)現(xiàn)了JDK的Map接口,并且添加了一些非常方便的方法用來存取基本數(shù)據(jù)類型
2-4 淺談JobExecutionContext&JobDataMap(下)

獲取JobDataMap的兩種方式

從Map中直接獲取
Job實(shí)現(xiàn)類中添加setter方法對(duì)應(yīng)JobDataMap的鍵值
(Quartz框架默認(rèn)的JobFactory實(shí)現(xiàn)類在初始化job實(shí)例對(duì)象時(shí)會(huì)自動(dòng)地調(diào)用這些setter方式)

代碼演示

1.HelloScheduler類改造

package com.myimooc.helloquartz.two;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
 * 編寫 任務(wù)調(diào)度類
 * @author ZhangCheng on 2017-06-26
 *
 */
public class HelloScheduler {
    
    public static void main(String[] args) throws SchedulerException {
        
        // 創(chuàng)建一個(gè) JobDetail 實(shí)例,將該實(shí)例與 HelloJob 實(shí)例綁定
        JobDetail jobDeatil = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myjob", "jobgroup1")// 定義標(biāo)識(shí)符
                .usingJobData("message", "hello myjob1")// 傳入自定義參數(shù)
                .usingJobData("floatJobValue", 3.14F)// 傳入自定義參數(shù)
                .build();
        
        System.out.println("jobDetail"s name : " + jobDeatil.getKey().getName());
        System.out.println("jobDetail"s group : " + jobDeatil.getKey().getGroup());
        System.out.println("jobDetail"s jobClass : " + jobDeatil.getJobClass().getName());
        
        // 創(chuàng)建一個(gè) Trigger 實(shí)例,定義該 job 立即執(zhí)行,并且每隔兩秒重復(fù)執(zhí)行一次,直到永遠(yuǎn)
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("myTrigger","trigroup1")// 定義標(biāo)識(shí)符
                .usingJobData("message", "hello mytrigger1")// 傳入自定義參數(shù)
                .usingJobData("doubleTriggerValue", 2.0D)// 傳入自定義參數(shù)
                .startNow()// 定義立即執(zhí)行
                .withSchedule(SimpleScheduleBuilder
                        .simpleSchedule()
                        .withIntervalInSeconds(2)
                        .repeatForever())// 定義執(zhí)行頻度
                .build();
        
        // 創(chuàng)建 Scheduler 實(shí)例
        SchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        
        // 綁定 JobDetail 和 trigger
        scheduler.scheduleJob(jobDeatil, trigger);
        
        // 執(zhí)行任務(wù)
        scheduler.start();
        
        // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Time Is : " + sf.format(date));
    }
    
}

2.HelloJob類改造

package com.myimooc.helloquartz.two;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.TriggerKey;

/**
 * 編寫 自定義任務(wù)
 * @author ZhangCheng on 2017-06-26
 *
 */
public class HelloJob implements Job{
    
    // 方式二:getter和setter獲取
    // 成員變量 與 傳入?yún)?shù)的key一致
    private String message;
    private Float floatJobValue;
    private Double doubleTriggerValue;
    
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public Float getFloatJobValue() {
        return floatJobValue;
    }
    public void setFloatJobValue(Float floatJobValue) {
        this.floatJobValue = floatJobValue;
    }
    public Double getDoubleTriggerValue() {
        return doubleTriggerValue;
    }
    public void setDoubleTriggerValue(Double doubleTriggerValue) {
        this.doubleTriggerValue = doubleTriggerValue;
    }
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Exec Time Is : " + sf.format(date));
        
        // 編寫具體的業(yè)務(wù)邏輯
        //System.out.println("Hello World!");
        
        JobKey key = context.getJobDetail().getKey();
        System.out.println("My name and group are : " + key.getName() + " : " + key.getGroup());
        
        TriggerKey trkey = context.getTrigger().getKey();
        System.out.println("My Trigger name and group are : " + trkey.getName() + " : " + trkey.getGroup());
        
        // 方式一:Map中直接  獲取自定義參數(shù)
        JobDataMap jdataMap = context.getJobDetail().getJobDataMap();
        JobDataMap tdataMap = context.getTrigger().getJobDataMap();
        String jobMsg = jdataMap.getString("message");
        Float jobFloatValue = jdataMap.getFloat("floatJobValue");
        
        String triMsg = tdataMap.getString("message");
        Double triDoubleValue = tdataMap.getDouble("doubleTriggerValue");
        
        System.out.println("jobMsg is : " + jobMsg);
        System.out.println("jobFloatValue is : " + jobFloatValue);
        System.out.println("triMsg is : " + triMsg);
        System.out.println("triDoubleValue is : " + triDoubleValue);
        
        // 方式一:Map中直接獲取 獲取自定義參數(shù)
        JobDataMap jobDataMap = context.getMergedJobDataMap();
        jobMsg = jobDataMap.getString("message");
        jobFloatValue = jobDataMap.getFloat("floatJobValue");
        
        triMsg = jobDataMap.getString("message");
        triDoubleValue = jobDataMap.getDouble("doubleTriggerValue");
        
        System.out.println("jobMsg is : " + jobMsg);
        System.out.println("jobFloatValue is : " + jobFloatValue);
        System.out.println("triMsg is : " + triMsg);
        System.out.println("triDoubleValue is : " + triDoubleValue);
        
        // 方式二:getter和setter獲取
        System.out.println("message is : " + this.message);
        System.out.println("jobFloatValue is : " + this.floatJobValue);
        System.out.println("triDoubleValue is : " + this.doubleTriggerValue);
    }
    
}
2-5 淺談Trigger

Trigger是什么

Quartz中的觸發(fā)器用來告訴調(diào)度程序作業(yè)什么時(shí)候觸發(fā)
即Trigger對(duì)象時(shí)用來觸發(fā)執(zhí)行Job的

Quartz框架中的Trigger示意圖

觸發(fā)器通用屬性

JobKey:表示job實(shí)例的標(biāo)識(shí),觸發(fā)器被觸發(fā)時(shí),該指定的job實(shí)例會(huì)執(zhí)行
StartTime:表示觸發(fā)器的時(shí)間表首次被觸發(fā)的時(shí)間,它的值的類型是Java.util.Date
EndTime:指定觸發(fā)器的不再被觸發(fā)的時(shí)間,它的值的類型是Java.util.Date

代碼演示

1.HelloJob類改造

package com.myimooc.helloquartz.three;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.Trigger;

/**
 * 自定義任務(wù)  觸發(fā)器通用屬性
 * @author ZhangCheng on 2017-06-26
 *
 */
public class HelloJob implements Job{
    
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Exec Time Is : " + sf.format(date));
        
        Trigger currentTrigger = context.getTrigger();
        System.out.println("Start Time Is : " + sf.format(currentTrigger.getStartTime()));
        System.out.println("End Time Is : " + sf.format(currentTrigger.getEndTime()));
        
        JobKey jobKey = currentTrigger.getJobKey();
        System.out.println("JobKey info : " + " jobName : " + jobKey.getName()
                + " jobGroup : " + jobKey.getGroup());
    }
    
}

2.HelloScheduler類改造

package com.myimooc.helloquartz.three;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
 * 任務(wù)調(diào)度類  觸發(fā)器通用屬性
 * @author ZhangCheng on 2017-06-26
 *
 */
public class HelloScheduler {
    
    public static void main(String[] args) throws SchedulerException {
        // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Time Is : " + sf.format(date));
        
        // 創(chuàng)建一個(gè) JobDetail 實(shí)例,將該實(shí)例與 HelloJob 實(shí)例綁定
        JobDetail jobDeatil = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myjob", "jobgroup1")// 定義標(biāo)識(shí)符
                .build();
        
        // 獲取距離當(dāng)前時(shí)間3秒后的時(shí)間
        date.setTime(date.getTime() + 3000);
        // 獲取距離當(dāng)前時(shí)間6秒后的時(shí)間
        Date endDate = new Date();
        endDate.setTime(endDate.getTime() + 6000);
        
        // 創(chuàng)建一個(gè) Trigger 實(shí)例,定義該 job 立即執(zhí)行,并且每隔兩秒重復(fù)執(zhí)行一次,直到永遠(yuǎn)
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("myTrigger","trigroup1")// 定義標(biāo)識(shí)符
                .startAt(date)// 定義3秒后執(zhí)行
                .endAt(endDate)// 定義6秒后結(jié)束
                .withSchedule(SimpleScheduleBuilder
                        .simpleSchedule()
                        .withIntervalInSeconds(2)
                        .repeatForever())// 定義執(zhí)行頻度
                .build();
        
        // 創(chuàng)建 Scheduler 實(shí)例
        SchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        
        // 綁定 JobDetail 和 trigger
        scheduler.scheduleJob(jobDeatil, trigger);
        
        // 執(zhí)行任務(wù)
        scheduler.start();
    }
    
}
2-6 SimpleTrigger

SimpleTrigger的作用

在一個(gè)指定時(shí)間段內(nèi)執(zhí)行一次作業(yè)任務(wù)
或是在指定的時(shí)間間隔內(nèi)多次執(zhí)行作業(yè)任務(wù)

需要注意的點(diǎn)

重復(fù)次數(shù)可以為0,正整數(shù)或是SimpleTrigger.REPEAT_INDEFINITELY常量值
重復(fù)執(zhí)行間隔必須為0或長(zhǎng)整數(shù)
一旦被指定了endTime參數(shù),那么它會(huì)覆蓋重復(fù)次數(shù)參數(shù)的效果

代碼演示

1.HelloJob類改造

package com.myimooc.helloquartz.four;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * SimpleTrigger 演示
 * @author ZhangCheng on 2017-06-26
 *
 */
public class HelloJob implements Job{
    
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Exec Time Is : " + sf.format(date));
        
        System.out.println("Hello World!");
    }
    
}

2.HelloScheduler類改造

package com.myimooc.helloquartz.four;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
 * SimpleTrigger 演示
 * @author ZhangCheng on 2017-06-26
 *
 */
public class HelloScheduler {
    
    public static void main(String[] args) throws SchedulerException {
        // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Time Is : " + sf.format(date));
        
        // 創(chuàng)建一個(gè) JobDetail 實(shí)例,將該實(shí)例與 HelloJob 實(shí)例綁定
        JobDetail jobDeatil = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myjob", "jobgroup1")// 定義標(biāo)識(shí)符
                .build();
        
        // 獲取距離當(dāng)前時(shí)間4秒鐘之后的具體時(shí)間
        date.setTime(date.getTime() + 4000);
        // 獲取距離當(dāng)前時(shí)間6秒鐘之后的具體時(shí)間
        Date endDate = new Date();
        endDate.setTime(endDate.getTime() + 6000);
        
        // 距離當(dāng)前時(shí)間4秒鐘后首次執(zhí)行任務(wù),之后每隔2秒鐘重復(fù)執(zhí)行一次任務(wù)
        // 知道距離當(dāng)前時(shí)間6秒鐘之后為止
        SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder
                .newTrigger()
                .withIdentity("myTrigger","trigroup1")// 定義標(biāo)識(shí)符
                .startAt(date)
                .endAt(endDate)
                .withSchedule(SimpleScheduleBuilder
                        .simpleSchedule()
                        .withIntervalInSeconds(2)
                        .withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY))
                .build();
         
        // 創(chuàng)建 Scheduler 實(shí)例
        SchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.scheduleJob(jobDeatil, trigger);
        scheduler.start();
    }
    
}
2-7 CronTrigger

CronTrigger的作用

基于日歷的作業(yè)調(diào)度器,而不是像SimpleTrigger那樣精確指定間隔時(shí)間,比SimpleTrigger更常用

Cron表達(dá)式

用于配置CronTrigger實(shí)例
是由7個(gè)子表達(dá)式組成的字符串,描述了時(shí)間表的詳細(xì)信息
格式:[秒][分][小時(shí)][日][月][周][年]

Cron表達(dá)式特殊字符意義對(duì)應(yīng)表

特殊符號(hào)解釋

Cron表達(dá)式舉例

Cron表達(dá)式小提示

L和W可以一組合使用
周字段英文字母不區(qū)分大小寫即MON與mon相同
利用工具,在線生成
2-8 淺談Scheduler

Scheduler工廠模式

所有的Scheduler實(shí)例應(yīng)該由SchedulerFactory來創(chuàng)建

SchedulerFactory類圖

回顧Quartz三個(gè)核心概念

調(diào)度器
任務(wù)
觸發(fā)器

示意圖

Scheduler的創(chuàng)建方式

StdSchedulerFactory

使用一組參數(shù)(Java.util.Properties)來創(chuàng)建和初始化Quartz調(diào)度器
配置參數(shù)一般存儲(chǔ)在quartz.properties中
調(diào)用getScheduler方法就能創(chuàng)建和初始化調(diào)度器對(duì)象

Scheduler的主要函數(shù)

// 綁定 jobDetail 和 trigger,將它注冊(cè)進(jìn) Scheduler 當(dāng)中
Date scheduleJob(JobDetail jobDetail, Trigger trigger)
// 啟動(dòng) Scheduler
void start()
// 暫停 Scheduler
void standby()
// 關(guān)閉 Scheduler
void shutdown()
2-9 QuartzProperties文件

quartz.properties組成部分

調(diào)度器屬性
線程池屬性
作業(yè)存儲(chǔ)設(shè)置
插件配置

調(diào)度器屬性

線程池屬性

threadCount:工作線程數(shù)量
threadPriority:工作線程優(yōu)先級(jí)
org.quartz.threadPool.class:配置線程池實(shí)現(xiàn)類

作業(yè)存儲(chǔ)設(shè)置

描述了在調(diào)度器實(shí)例的生命周期中,Job和Trigger信息是如何被存儲(chǔ)的

插件配置

滿足特定需求用到的Quartz插件的配置
第三章:Spring、Quartz大合體 3-1 搭建工程

基于Maven創(chuàng)建一個(gè)簡(jiǎn)單的SpringMVC工程,學(xué)習(xí)時(shí),使用springboot框架。

項(xiàng)目POM文件


  4.0.0

  com.myimooc
  springquartz
  0.0.1-SNAPSHOT
  jar

  springquartz
  http://maven.apache.org

  
        org.springframework.boot
        spring-boot-starter-parent
        1.5.1.RELEASE
         
    

    
        UTF-8
        UTF-8
    

    
        
            org.springframework.boot
            spring-boot-starter
        
    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.springframework
            spring-context-support
        
        
        
            org.springframework
            spring-tx
        
        
        
            org.springframework.boot
            spring-boot-starter-freemarker
        
        
        
        
            org.quartz-scheduler
            quartz
            2.3.0
        
        
        
            junit
            junit
            test
        
    
  
  
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.8
                    1.8
                
            
        
    
    

項(xiàng)目目錄結(jié)構(gòu)

3-2 Quartz和Spring大合體

使用Quartz配置作業(yè)兩種方式

MethodInvokingJobDetailFactoryBean
JobDetailFactoryBean

方式一:使用MethodInvokingJobDetailFactoryBean

1.調(diào)用myBean的printMessage方法

2.MyBean類

方式二:使用JobDetailFactoryBean

1.需要給作業(yè)傳遞數(shù)據(jù),想要更加靈活的話就是用這種方式

2.FirstScheduleJob類

3.AnotherBean類

代碼演示:

演示說明:教學(xué)基于xml進(jìn)行配置,學(xué)習(xí)時(shí)基于javaconfig進(jìn)行配置。

1.編寫MyBean類

package com.myimooc.springquartz.quartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.stereotype.Component;

/**
 * 方式一:使用MethodInvokingJobDetailFactoryBean 演示
 * @author ZhangCheng on 2017-06-28
 *
 */
@Component
public class MyBean {
    
    public void printMessage(){
        
        // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        System.out.println("MyBean Executes!" + sf.format(date));
    }
    
}

2.編寫AnotherBean類

package com.myimooc.springquartz.quartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.stereotype.Component;

/**
 * 方式二:使用JobDetailFactoryBean 演示
 * @author ZhangCheng on 2017-06-28
 *
 */
@Component
public class AnotherBean {
    
    public void printAnotherMessage(){
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        System.out.println("I am AnotherBean." + sf.format(date));
    }
    
}

3.編寫FirstScheduledJob類

package com.myimooc.springquartz.quartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

/**
 * 方式二:使用JobDetailFactoryBean 演示
 * @author ZhangCheng on 2017-06-28
 *
 */
public class FirstScheduledJob extends QuartzJobBean {
    
    private AnotherBean anotherBean;
    
    public void setAnotherBean(AnotherBean anotherBean) {
        this.anotherBean = anotherBean;
    }

    @Override
    protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        System.out.println("FirstScheduledJob Excutes!" + sf.format(date));
        this.anotherBean.printAnotherMessage();
    }

}

4.編寫QuartzConfig類

package com.myimooc.springquartz.config;

import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;

import com.myimooc.springquartz.quartz.AnotherBean;
import com.myimooc.springquartz.quartz.FirstScheduledJob;
import com.myimooc.springquartz.quartz.MyBean;

/**
 * Quartz 配置類
 * @author ZhangCheng on 2017-06-28
 *
 */
@Configuration
public class QuartzConfig {
    
    @Autowired
    private MyBean myBean;
    
    @Autowired
    private AnotherBean anotherBean;
    
    /**
     * 方式一:使用MethodInvokingJobDetailFactoryBean
     * @return
     */
    @Bean
    public MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean(){
        MethodInvokingJobDetailFactoryBean mb = new MethodInvokingJobDetailFactoryBean();
        mb.setTargetObject(myBean);// 指定要運(yùn)行的類
        mb.setTargetMethod("printMessage");// 指定要允許類中的那個(gè)方法
        return mb;
    }
    
    /**
     * 方式二:使用JobDetailFactoryBean
     * @return
     */
    @Bean
    public JobDetailFactoryBean jobDetailFactoryBean(){
        JobDetailFactoryBean  jb= new JobDetailFactoryBean();
        jb.setJobClass(FirstScheduledJob.class);// 指定要運(yùn)行的類
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("anotherBean", anotherBean);
        
        jb.setJobDataMap(jobDataMap);// 設(shè)置傳入自定義參數(shù)
        jb.setDurability(true);
        return jb;
    }
    
    /**
     * 配置 SimpleTriggerFactoryBean
     * @return
     */
    @Bean
    public SimpleTriggerFactoryBean simpleTriggerFactoryBean(){
        SimpleTriggerFactoryBean sb = new SimpleTriggerFactoryBean();
        sb.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());// 設(shè)置需要綁定的 jobDetail
        sb.setStartDelay(1000L);// 距離當(dāng)前時(shí)間1秒后執(zhí)行
        sb.setRepeatInterval(2000L);// 之后每隔2秒執(zhí)行一次
        return sb;
    }
    
    /**
     * 配置 SimpleTriggerFactoryBean
     * @return
     */
    @Bean
    public CronTriggerFactoryBean cronTriggerFactoryBean(){
        CronTriggerFactoryBean cb = new CronTriggerFactoryBean();
        cb.setJobDetail(jobDetailFactoryBean().getObject());// 設(shè)置需要綁定的 jobDetail
        cb.setStartDelay(1000L);// 距離當(dāng)前時(shí)間1秒后執(zhí)行
        cb.setCronExpression("0/5 * * ? * *");// 設(shè)置 Cron 表達(dá)式,之后每隔5秒執(zhí)行一次
        return cb;
    }
    
    /**
     * 配置 SchedulerFactoryBean
     * @return
     */
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(){
        SchedulerFactoryBean sb= new SchedulerFactoryBean();
        // 配置 JobDetails
        JobDetail[] jobDetails = new JobDetail[2];
        jobDetails[0] = methodInvokingJobDetailFactoryBean().getObject();
        jobDetails[1] = jobDetailFactoryBean().getObject();
        sb.setJobDetails(jobDetails);
        
        // 配置 Trigger
        Trigger[] triggers = new Trigger[2];
        triggers[0] = simpleTriggerFactoryBean().getObject();
        triggers[1] = cronTriggerFactoryBean().getObject();
        sb.setTriggers(triggers);
        return sb;
        
    }
}
第四章:課程總結(jié) 4-1 課程總結(jié)

課程回顧

Timer
Quartz
Quartz&Spring融合

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/67241.html

相關(guān)文章

  • 課網(wǎng)_Java定時(shí)任務(wù)調(diào)度工具詳解Timer學(xué)習(xí)總結(jié)

    時(shí)間:2017年05月24日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:無個(gè)人學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是定時(shí)任務(wù)調(diào)度 基于給定的時(shí)間點(diǎn),給定的時(shí)間間隔或者給定的執(zhí)行次數(shù)自動(dòng)執(zhí)行的任務(wù) 在Java中的定時(shí)調(diào)度工具 Timer:小弟,能實(shí)現(xiàn)日常60%的定...

    wind5o 評(píng)論0 收藏0
  • 保存數(shù)據(jù)到MySql數(shù)據(jù)庫——我用scrapy寫爬蟲(二)

    摘要:坦克大戰(zhàn)上簡(jiǎn)介上的坦克大戰(zhàn)相信大家都玩過有逃學(xué)玩坦克的可以自己默默的扣一個(gè)了我們現(xiàn)在長(zhǎng)大了,學(xué)習(xí)游戲開發(fā)了。 寫在前面 上一篇(https://www.tech1024.cn/origi... )說了如何創(chuàng)建項(xiàng)目,并爬去網(wǎng)站內(nèi)容,下面我們說一下如何保存爬去到的數(shù)據(jù) 開始爬取 創(chuàng)建Spider,上一篇我們已經(jīng)創(chuàng)建了ImoocSpider,我們做一下修改,可以連續(xù)下一頁爬取。scrapyD...

    Kross 評(píng)論0 收藏0
  • 課網(wǎng)_《RxJava與RxAndroid基礎(chǔ)入門》學(xué)習(xí)總結(jié)

    時(shí)間:2017年10月16日星期一說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:無學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程簡(jiǎn)介 1-1 課程介紹 本門課程的主要內(nèi)容 RxJava是什么 RxAndroid是什么 RxJava常用操作符(重點(diǎn)、難點(diǎn)) 怎樣在項(xiàng)目中使用RxJava和RxAndroid 如何學(xué)...

    劉明 評(píng)論0 收藏0
  • 課網(wǎng)_《RabbitMQ消息中間件極速入門與實(shí)戰(zhàn)》學(xué)習(xí)總結(jié)

    摘要:慕課網(wǎng)消息中間件極速入門與實(shí)戰(zhàn)學(xué)習(xí)總結(jié)時(shí)間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。 慕課網(wǎng)《RabbitMQ消息中間件極速入門與實(shí)戰(zhàn)》學(xué)習(xí)總結(jié) 時(shí)間:2018年09月05日星期三 說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com 教學(xué)源碼:無 學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:RabbitM...

    mykurisu 評(píng)論0 收藏0
  • SpringCloud(第 010 )簡(jiǎn)單 Quartz-Cluster 支持集群分布式且支持動(dòng)態(tài)

    摘要:通過再添加其他的元素可在中放置多個(gè)觸發(fā)器。停止觸發(fā)器重啟觸發(fā)器停止觸發(fā)器移除觸發(fā)器添加調(diào)度的任務(wù)類調(diào)度的任務(wù)。執(zhí)行的張表入數(shù)據(jù)庫添加啟動(dòng)類簡(jiǎn)單微服務(wù),支持集群分布式,并支持動(dòng)態(tài)修改任務(wù)的執(zhí)行時(shí)間。 SpringCloud(第 010 篇)簡(jiǎn)單 Quartz-Cluster 微服務(wù),支持集群分布式,并支持動(dòng)態(tài)修改 Quartz 任務(wù)的 cronExpression 執(zhí)行時(shí)間 - 一、大致...

    xiyang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<