Go Revel - Jobs(任務調度模塊)
revel提供了一個框架用于脫離請求流程的執行異步任務,一般用來執行經常運行的任務、更新緩存數據或發送郵件等。
##啟用
該框架作為一個可選的revel模塊,默認并不啟用。需要更改應用配置來啟用它:
module.jobs = github.com/robfig/revel/modules/jobs
此外,為了訪問任務監控頁面,需要將下面添加至路由配置:
module:jobs
這條語句將在路由配置中加入`/@jobs`地址
##參數
一些選項告訴jobs框架在運行任務時應該具有什么樣的限制,下面是默認值:
jobs.pool = 10 # 允許同時執行多少個任務
jobs.selfconcurrent = false # 允許一個任務只有在前一個實例完成后才能運行
##啟動任務
使用`revel.OnAppStart`函數在程序開始運行時啟動一個任務,revel將在啟動服務器之前連續的運行這些任務。注意,此功能并不是用jobs模塊,但是它可以用來提交一個jobs作業而不終端服務器的啟動。
func init() {
revel.OnAppStart(func() { jobs.Now(populateCache{}) })
}
##經常性的任務
任務可以被任何時間表調度,有兩個方法來表示時間表:
1、一個cron表達式
2、一個固定的時間間隔
revel使用`cron`來處理cron表達式并執行任務,這里對`cron`的格式進行了詳細的說明: https://github.com/robfig/cron/blob/master/README.md
任務通常在`revel.OnAppStart`處理器注冊,但也可以在之后的任何時間來注冊一個任務。
import (
"github.com/robfig/revel"
"github.com/robfig/revel/modules/jobs/app/jobs"
"time"
)
type ReminderEmails struct {
// 省略
}
func (e ReminderEmails) Run() {
// 查詢數據庫
// 發送一些郵件
}
func init() {
revel.OnAppStart(func() {
jobs.Schedule("0 0 0 * * ?", ReminderEmails{})
jobs.Schedule("@midnight", ReminderEmails{})
jobs.Schedule("@every 24h", ReminderEmails{})
jobs.Every(24 * time.Hour, ReminderEmails{})
})
}
##命名的調度器
可以在`app.conf`定義一個調度器,然后在任何地方引用它,這樣有助于提供容易理解并且可重用的調度器。
在`app.conf`定義一個命名的調度器:
cron.workhours_15m = 0 */15 9-17 ? * MON-FRI
在任何地方使用命名的調度器來設置cron描述表達式:
func init() {
revel.OnAppStart(func() {
jobs.Schedule("cron.workhours_15m", ReminderEmails{})
})
}
注意,自定義的調度器名稱必須以`cron.`開頭。
##一次性任務
有時,相應用戶的請求需要做一些事,jobs模塊允許提交一個單次執行的任務。
type AppController struct { *revel.Controller }
func (c AppController) Action() revel.Result {
// 處理請求.
...
// 現在異步的發送郵件
jobs.Now(SendConfirmationEmail{})
//或者在單位時間之后再異步的發送郵件
jobs.In(time.Minute, SendConfirmationEmail{})
}
##注冊函數
也可以將`func()`方式的函數使用`jobs.Func`類型包裝并當作一個任務:
func sendReminderEmails() {
// 查詢數據庫
// 發送郵件
}
func init() {
revel.OnAppStart(func() {
jobs.Schedule("@midnight", jobs.Func(sendReminderEmails))
})
}
##任務狀態
jobs模塊提供了一個狀態頁面用來顯示所有的任務調度,以及它們的狀態(IDLE 空閑 或 RUNNING 運行)還有它們上一次以及下一次的運行時間。

安全起見,只有請求來自`127.0.0.1`的時候,次頁面才被顯示。
##受限的任務池
可以設置jobs任務池大小用來限制同一時間運行任務的數量,這可以允許開發人員限制異步任務所使用的資源 - 如果常規的交互響應權重高于異步處理。如果任務池中正在運行的任務滿了,那么新的任務會被阻塞直到池中有任務完成。
##開發相關
1、允許以HTTP基本的驗證方式訪問任務狀態頁面
2、允許系統管理員在任務狀態頁面以交互方式運行調度任務
3、為任務的運行提供能多的可視化效果,如池大小,隊列長度
浙公網安備 33010602011771號