天天看點

基于Quartz實作定時任務-架構學習Quartz筆記

Quartz筆記

最近碰到了一個場景,需要能夠在指定時間執行任務,比如每周周六周日的3點開啟一個服務,那麼總不能說,把以後的每個周六周日的日期列出來讓程式執行吧,是以就百度了一下找到了這麼一個開源架構,Qartz,這個東西上手還是蠻簡單的,是以打算記錄下來

配置

maven的話,比較容易,就添加上項目依賴就好了

<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
        <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>
           

emmm,maven倉庫能搜到的最新的是2.3.0的,但是官網都沒出教程= =是以我還是選擇了2.2.1,慫一點總沒錯,況且需要功能不多。

配置檔案

這個比較簡單,就在resources檔案夾裡面放一個名字叫

quartz.properties

的檔案,然後裡面寫幾句話:

org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
           

那麼第一個就是名字,第二個是最大線程數,就跟那個,線程池一樣的東西,第三個是存儲方式,他好像是可以把任務存到資料庫,也可以存到RAM,我們最終的希望還是存到資料庫的,但是RAM是新手教程的方式,是以我就先試試RAM,後面再轉JDBC。

運作

這應該是我碰到的最簡單的運作方式了

public class Scheduler implements Runnable{

    private static org.quartz.Scheduler scheduler;

    @Override
    public void run() {
        try {
            // Grab the TaskHandler instance from the Factory
            scheduler = StdSchedulerFactory.getDefaultScheduler();

            // and start it off
            scheduler.start();

        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
}
           

獲得一個預設的Scheduler,然後start就行了

然後你就能看到這個:

基于Quartz實作定時任務-架構學習Quartz筆記

就啟動完成啦

建立一個任務

他的一個任務是叫做,job,顧名思義,就是任務,比如該咋幹活,然後啥的,主要是一個任務流程問題,那麼我們看一下内部。

public interface Job {
    void execute(JobExecutionContext var1) throws JobExecutionException;
}
           

内部非常簡單,一個execute就行啦,是以我們需要做的,就是實作這個任務

public class MyJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("fin's job");
    }
}
           

我們就建立了一個job,那麼當要執行這個任務的時候,就會執行execute了!是以說我們隻需要定義好這個execute,就能正确執行我們想要的東西了。

那麼這個job怎麼放到任務裡,他有個builder模式,名稱為

org.quartz.JobBuilder

,那麼我們可以通過這個來構造一個job

JobDetail就是我們需要執行的一個任務了,他是通過JobBuilder類的newJob靜态方法,将我們執行個體化的Job給建構出來,然後build後生成我們需要的JobDetail對象。

Job傳值

job的builder可以使用

usingJobData

方法來進行傳值,那麼這個東西在架構中被稱作:JobDataMap,還是很明顯,意思是任務資料map,usingJobData可以了解成Map.put(),前面是key,後面是value。

JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
    .usingJobData("name","finQQ")
    .build();
           

那麼我們怎麼獲得這個值。

隻需要這句話:

Map map = jobExecutionContext.getJobDetail().getJobDataMap();
        System.out.println(map.get("name") + "'s job");
           

這樣就獲得了我們需要的資料。同樣,builder裡面還有很多函數可以供我們選擇。

觸發器

剛剛Job是做什麼,那麼Trigger就是什麼時候做,我們最需要的就是這個Trigger

建立Trigger也是通過所謂的TriggerBuilder來建立

Trigger trigger = TriggerBuilder.newTrigger()
    .startNow()
     .withSchedule(simpleSchedule()
         .withIntervalInSeconds()
         .repeatForever())
     .build();
           

上面就是建立一個觸發器。

  • startNow 現在開始
  • withSchedule 日程表,這個就是決定我們什麼時候做什麼的,有SimpleSchedule還有CronSchedule,這個就是建立一個每40秒循環一次然後循環到死的普通日程表
  • build 建構開始

Schedule

Cronschedule應該是我需要的那種,是以晚點會專門研究一下。。

最後一步

添加我們的job和trigger到工作區

效果

基于Quartz實作定時任務-架構學習Quartz筆記

可以看到,每隔40秒就列印出了一個消息,下一篇我會根據實際應用寫一下我的使用