任務調度和異步執行
目錄
一、任務調度概述
1. 應用常見的任務調度,比如以時間爲關注點的調度
- 隔半小時生成精華文章
- 凌晨統計用戶排名
- 每30分鐘針對鎖定到期的用戶進行解鎖
- 每月1日凌晨統計上個月的數據,生成報表
- 每半小時查詢用戶是否有快到期的處理業務等
以及以資源爲關注點的調度,比如:web server處理線程請求時,使用線程池共享服務的線程資源。
2. 任務調度本身涉及多線程併發、運行時間規則制定及解析、運行現場保持與恢復、線程池維度等多方面的工作。
二、任務調度Quartz
2.1 Quartz基礎結構
主要有調度器、任務和觸發器三個概念。
【1】Job接口
-
- 是一個接口,通過實現該接口來定義執行任務
- 只有一個方法void execute(JobExecutionContext context)
- Job運行時信息保存在JobDataMap實例中
- 有一個StatefulJob子接口,表示有狀態的任務,不能併發執行。無狀態的可併發
【2】JobDetail類
-
- 用來描述Job實現類機器靜態信息,如名稱、描述、關聯監聽器等
- 執行Job時,接收Job實現類,然後通過反射機制的newInstance來實例化job
- 構造函數:JobDetail(String name, String group, jobClass),name和group指在scheduler中的組名和名稱
【3】Trigger類
-
- 是一個類,描述job的時間觸發規則,有兩個子類:
- SimpleTrigger:只觸發一次或者固定間隔週期觸發時使用
- CronTrigger:可通過cron表達式來進行復雜調度
【4】Calendar
-
- 是日曆特定時間點的集合,如每年AnnualCalendar、每月MonthlyCalendar、每週WeeklyCalendar等
- 一個Trigger可以跟多個Calendar關聯
- 舉個栗子,如安排週一早晨9點執行任務,但遇到法定節假日則不執行,這時需要使用Calendar進行定點排除
【5】Scheduler
-
- 代表一個Quartz的獨立運行容器
- Trigger和JobDetail可以註冊到Scheduler中,擁有各自的組和名稱
- Scheduler可將Trigger綁定到JobDetail中,這樣Trigger被觸發時,job會執行
- job和Trigger是1對多的瓜系,Scheduler和前兩者是1對多的瓜系
- 可通過SchedulerFactory來創建Scheduler,有個SchedulerContext,通過Map保存上下文數據
【6】ThreadPool
-
- Scheduler使用線程池作爲任務運行的基礎設施
Quartz有完善的事件和監聽體系。包括:
- 任務執行前/後事件
- 觸發器觸發前/後事件
- 調度器開始/關閉事件等
2.2 使用SimpleTrigger
2.3 使用CronTrigger
2.4 使用Calendar
2.5 任務調度信息存儲
1. 通過配置文件調整保存策略
Quartz的屬性配置文件包括三方面:
- 集羣信息
- 調度器線程池
- 任務調度線程數據的保存
2.查詢數據庫中的運行信息