定時任務發展史
定時任務應該是互聯網行業裡面最常用的服務之一了,不同的語言有不同的實現方式,比較常用的也有使用linux的crontab命令來實現的。但是在Java里,使用最廣泛的就是quartz了。 就連我們公司使用的quartz已經使用了三個版本,每一個版本在上個版本中有所優化,寫這篇文章一方面介紹一下quartz的使用,另一方可以根據此項目的變遷反應出我司平台架構不斷變遷的一個縮影。
定時任務的使用場景很多,以我司來講:定時計息,派息、對賬等等。
quartz 介紹
Quartz是個開源的作業調度框架,為在Java應用程序中進行作業調度提供了簡單卻強大的機制。Quartz允許開發人員根據時間間隔(或天)來調度作業。它實現了作業和觸發器的多對多關係,還能把多個作業與不同的觸發器關聯。Quartz可以集成幾乎任何的java應用程序—從小的單片機系統到大型的電子商務系統。Quartz可以執行上千上萬的任務調度。
Quartz核心的概念:scheduler任務調度、Job任務、JobDetail任務細節、Trigger觸發器
Scheduler:調度器,調度器接受一組JobDetail+Trigger即可安排一個任務,其中一個JobDetail可以關聯多個Trigger
Job:Job是任務執行的流程,是一個類
JobDetail:JobDetail是Job是實例,是一個對象,包含了該實例的執行計劃和所需要的數據
Trigger:Trigger是定時器,決定任務何時執行
使用Quartz調度系統的思路就是,首先寫一個具體的任務(job),配置任務的觸發時間(Trigger),Scheduler很根據JobDetail+Trigger安排去執行此任務。
Quartz 定時器的時間設置
時間的配置如下:0 30 16 * * ?
時間大小由小到大排列,從秒開始,順序為 秒,分,時,天,月,年 *為任意 ?為無限制。由此上面所配置的內容就是,在每天的16點30分啟動buildSendHtml() 方法
具體時間設定可參考 :
「0/10 * * * * ?」 每10秒觸發
「0 0 12 * * ?」 每天中午12點觸發 「0 * 14 * * ?」 在每天下午2點到下午2:59期間的每1分鐘觸發
「0 10,44 14 ? 3 WED」 每年三月的星期三的下午2:10和2:44觸發
「0 15 10 ? * MON-FRI」 周一至周五的上午10:15觸發
「0 0 06,18 * * ?」 在每天上午6點和下午6點觸發
第一代定時任務系統
我的第一代定時任務系統使用的很簡單,全部按照當時spring推薦的配置方式來進行,開發於2014年初。
首先在配置文件中配置定時任務的線城市
配置一個定時任務的工程和一個具體任務的基類
machineId:機器編碼
recordErrorDetail:是否記錄詳細日誌
這些都是自己實現的
通過timerFactory 來獲取具體的任務和觸發器
public class TimerFactory implements BeanFactoryAware {
private BeanFactory beanFactory;
public Object getTask(String taskCode) {
return beanFactory.getBean(taskCode+"Task");
}
public Object getTrigger(String taskCode) {
return beanFactory.getBean(taskCode+"Trigger");
public void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
public BeanFactory getBeanFactory() {
return beanFactory;
} }
baseTask集成了task,在裡面做了一些基礎的業務,比如定時任務開始的時候記錄定時任務的執行時間,定時任務結束的時候記錄執行的結果等。
public interface Task {
public void executeTask(); }
最後就是配置具體的定時任務了。已重發簡訊郵件的定時任務為例
0 0 0 * * ?
resendSmsAndEmailTask:具體的定時任務類
resendSmsAndEmailJob:包裝成具體的Job
resendSmsAndEmailTrigger:設置具體執行的時間,包裝成Trigger
具體的task類,刪掉了部分業務代碼:
public class ResendSmsAndEmailTask extends BaseTask{
private static final String TASK_CODE = "resendSmsAndEmail";
AtomicInteger ai = new AtomicInteger(0);
public void execute(){
try {
ai = new AtomicInteger(0);
// todo
}catch (Exception e) {
String exception = ExceptionUtils.getStackTrace(e);
logger.error("stat error with exception[{}].", exception);
this.recordTaskErrorDetail(this.taskRecordId, "ResendSmsAndEmailTask-" + e.getMessage(), exception);
}finally{
this.modifyTaskRecord(ai.get(), taskRecordId);
public String getTaskNo() {
return TASK_CODE;
最後配置scheduler進行任務的調度。
DynamicJobAssembler類代碼:
public class DynamicJobAssembler {
private static Logger logger = LoggerFactory.getLogger(DynamicJobAssembler.class);
@Resource
Scheduler scheduler;
TimerFactory timerFactory;
TaskDao taskDao;
public void init() {
logger.info("start to assemble task from db.");
List tasks = this.taskDao.getAllTask();
if (tasks == null || tasks.size()


※為了擴大產品的影響力,這些手機廠商的營銷方式讓節操碎了一地
※小組討論谷歌機器翻譯Attention is All You Need
※自動駕駛技術創業公司 Drive.ai獲5000 萬美元 B 輪融資
※高手來了!8個簡單有效的方法幫你提升設計檔次
※雜談CNN:如何通過優化求解輸入圖像
TAG:推酷 |
※時尚行業發展趨勢
※任洪斌:以新理念發展實體經濟
※時代發展的生存策略
※走進養老服務業發展新時代——養老服務業發展典型案例彙編之完善發展政策篇(2)
※奮力書寫新時代教育改革發展新篇章
※反艦導彈的發展歷史
※中醫學發展簡史
※歷史不一定是發展史:中國古代都城形態史的解構
※以新發展理念引領發展
※新時代如何發展素質教育
※「新時代的中國發展戰略」研討會舉行
※張野:證監會正在制定行業金融科技發展的指導意見
※新時代室內設計發展方向
※以新發展理念謀劃高質量發展——國家發展改革委負責人回應中國經濟熱點問題
※敦煌舞蹈歷史發展
※愛情發展階段
※職業教育如何找准發展新定位
※水陸法會發展史
※顯示器的發展歷史
※深化務實合作 謀求共贏發展