Quartz——任務調度的實現(實例+源碼+驚喜)

首先,說一下什麼叫做任務調度 詢問度娘中....

看了一下,度娘說的還挺囉嗦的,實在不懂的可以去問問度娘,在這我就不粘貼了。

就我的話來說,任務調度,就是在一個合適的時機去執行一項任務,當然這個時機是有計劃的。例如,你定了一個鬧鐘,到了指定的時間鬧鐘就會響,這就是一個任務的調度,包括指定的時機(鬧鐘定的時間),任務的進行及完成(鬧鐘響,你起床)。當然,這只是其中的一種理解....好了廢話不多說,進入正題:

Quartz是一個完全由java編寫的開源作業調度框架。不要讓作業調度這個術語嚇著你。儘管Quartz框架整合了許多額外功能, 但就其簡易形式看,你會發現它易用得簡直讓人受不了!(這是度孃的說法)

不過,看了這篇文章之後,你也會覺得它足夠簡單

說道Quartz,不得不提到它的兩個對象:

Job : 工作任務 ,你要做什麼

Trigger : 執行工作任務 觸發條件 , 什麼時間執行, 多久執行一次

在你的Job接口實現類裡面,添加一些邏輯到execute()方法。一旦你配置好Job實現類並設定好調度時間表,Quartz將密切注意剩餘時間。當調度程序確定該是通知你的作業的時候,Quartz框架將調用你Job實現類(作業類)上的execute()方法並允許做它該做的事情。無需報告任何東西給調度器或調用任何特定的東西。僅僅執行任務和結束任務即可。如果配置你的作業在隨後再次被調用,Quartz框架將在恰當的時間再次調用它。

在實際開發中的應用(舉個栗子):

1.商城的促銷活動,當你設置一個商品限時打折之後,務必會在活動結束之後將商品恢復原價,這就需要設置一個Trigger(在活動結束時執行一個任務,即Job),還需要設置一個Job(執行的事情就是將商品恢復原價)。

2.再比如,QQ上,到了你的生日或者你好友的生日,都會給你發出提醒,這使用了任務調度。

知道了要做什麼事,接下來就開懟吧:

在這裡,我給出的例子是ssm框架+Quartz任務調度的一個簡單實現,撇開ssm不說(有沒有,都不影響你的練習),Quartz的代碼大概就是以下內容(也不能說是大概內容,可以說是全部內容吧,不要問我為什麼,度娘說了:“你會發現它易用得簡直讓人受不了”):

圖中一共提到了兩種配置任務調度的方法(圖中已經介紹的很詳細了),這麼看著不方便的話,你可以把圖片下載下來,一邊理解一邊看,順著線條找到思路。

下面是代碼:

Quartz需要的依賴:

org.quartz-scheduler

quartz

2.2.1

org.quartz-scheduler

quartz-jobs

2.2.1

spring配置文件 applicationContext.xml:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd ">

自定義的工廠類 JobFactory :

package com.cc.job;

import org.quartz.spi.TriggerFiredBundle;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.config.AutowireCapableBeanFactory;

import org.springframework.scheduling.quartz.AdaptableJobFactory;

import org.springframework.stereotype.Service;

@Service("jobFactory")

public class JobFactory extends AdaptableJobFactory {

@Autowired

private AutowireCapableBeanFactory capableBeanFactory;

/*創建工作實例 固定*/

@Override

protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {

// 調用父類的方法

Object jobInstance = super.createJobInstance(bundle);

// 進行注入

capableBeanFactory.autowireBean(jobInstance);

return jobInstance;

}

}

任務類 DelUglyMovie :

package com.cc.job;

import java.util.Date;

import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

import org.springframework.stereotype.Service;

/**

* @author peng 2018年4月2日

* 刪除難看的

*/

@Service

public class DelUglyMovie implements Job{

/* (non-javadoc)

* @see org.quartz.Job#execute(org.quartz.JobExecutionContext)

*/

@Override

public void execute(JobExecutionContext context)

throws JobExecutionException {

System.out.println("執行DelUglyMovie");

System.out.println(new Date());

}

}

任務類 UpdateHotMovie :

package com.cc.job;

import java.util.List;

import javax.annotation.Resource;

import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

import org.springframework.stereotype.Service;

import com.cc.domain.Movie;

import com.cc.service.MovieService;

/**

* @author peng 2018年4月2日

*

*/

@Service

public class UpdateHotMovie implements Job{

@Resource

private MovieService movieService;

/* (non-javadoc)

* @see org.quartz.Job#execute(org.quartz.JobExecutionContext)

*/

@Override

public void execute(JobExecutionContext context)

throws JobExecutionException {

System.out.println("執行定時任務");

List movies = movieService.findAll();

for (Movie movie : movies) {

System.out.println(movie);

}

}

}

順便告訴你個事,文中也提到了一個叫做cron表達式的東東,它是什麼,你可以百度一下,然後你會發現,知道是什麼了之後不會寫怎麼辦,我會告訴你,莫慌,看法寶: http://cron.qqe2.com,這是一個自動生成cron表達式的地方,怎麼操作,看了就知道了,一般人我不告訴他....

java就像一盒巧克力,你永遠不知道,ta還爆出什麼bug....

以上內容均為個人所述,如有不妥,歡迎指正,謝謝

Quartz——任務調度的實現(實例+源碼+驚喜)


分享到:


相關文章: